<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>bubble&#39;s blog</title>
  
  
  <link href="http://example.com/atom.xml" rel="self"/>
  
  <link href="http://example.com/"/>
  <updated>2024-12-18T06:58:43.010Z</updated>
  <id>http://example.com/</id>
  
  <author>
    <name>bubble</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>编译</title>
    <link href="http://example.com/2024/12/18/compiler/"/>
    <id>http://example.com/2024/12/18/compiler/</id>
    <published>2024-12-18T06:55:32.000Z</published>
    <updated>2024-12-18T06:58:43.010Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1 id="1-概论"><a class="markdownIt-Anchor" href="#1-概论"></a> 1 概论</h1><p>程序设计语言：语法，语义，语用</p><h2 id="编译的起源程序设计语言的发展"><a class="markdownIt-Anchor" href="#编译的起源程序设计语言的发展"></a> 编译的起源：程序设计语言的发展</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411282020248.png" alt="img" /></p><p>低级语言：字位码、机器语言、汇编语言</p><p>高级语言从应用角度分类：</p><ul><li>基础语言：FORTRAN，COBOL，BASIC，ALGOL</li><li>结构化语言：具有很强的过程结构和数据结构能力，PASCAL，C，Ada</li><li>专用语言：为特殊应用而设计，APL，Forth</li></ul><h2 id="基本概念"><a class="markdownIt-Anchor" href="#基本概念"></a> 基本概念</h2><ul><li><p>源程序：用汇编语言或高级语言编写的程序</p></li><li><p>目标程序：用目标语言（介于源语言和机器语言之间的语言）所表示的程序</p></li></ul><p>翻译程序：将源程序转换为目标程序</p><p><mark>源程序是翻译程序的输入，目标程序是翻译程序的输出</mark></p><p>编译程序：一次编译可多次执行</p><p>解释程序：对源程序进行解释执行的程序，并不生成目标程序</p><p>编译-解释执行：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411282126789.png" alt="image-20241128212610735" /></p><h2 id="编译过程和编译程序构造"><a class="markdownIt-Anchor" href="#编译过程和编译程序构造"></a> 编译过程和编译程序构造</h2><h3 id="编译过程"><a class="markdownIt-Anchor" href="#编译过程"></a> 编译过程</h3><blockquote><p>将高级语言程序翻译为等价的目标程序，<mark>翻译的实质：语义的等价性</mark></p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409120823813.png" alt="image-20240912082329724" /></p><ul><li>词法分析：分析和识别单词。</li><li>语法分析：根据语法规则，识别出各种语法成分</li><li>语义分析、生成中间代码：对识别出的各种语法成分进行语义分析，并生成中间代码（介于源语言和目标语言的中间语言形式）<ul><li>便于优化处理，便于编译程序的移植</li></ul></li><li>生成目标程序</li></ul><p><mark>错误处理，符号表管理每遍都要</mark></p><h3 id="编译程序构造"><a class="markdownIt-Anchor" href="#编译程序构造"></a> 编译程序构造</h3><p>五个阶段都需要<strong>建表和查表</strong>和<strong>出错处理</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291108601.png" alt="image-20241129110807526" /></p><p>遍：对源程序（包括中间形式）从头到尾扫描一遍。</p><blockquote><p>⚠️区分遍与基本阶段的区别：</p><ul><li>基本阶段：将源程序翻译为目标程序在逻辑上要完成的工作</li><li>遍：指完成上述基本阶段要经过一次或几次扫描处理</li></ul><p><mark>可能一次扫描完成多个基本阶段</mark></p></blockquote><h4 id="前端和后端"><a class="markdownIt-Anchor" href="#前端和后端"></a> 前端和后端</h4><ul><li>对源程序的分析，并生成与其等价的中间形式（<mark>前端：与源语言有关</mark>）<ul><li>词法分析：将字符串形式的源程序分解为具有独立语法意义的单词符号 token</li><li>语法分析：根据语法规则将单词进一步组合成大的语法类或语法成分，如变量声明、表达式、语句、函数和过程等，<strong>生成语法数</strong></li><li>语义分析：对通过语法分析程序识别出来的语法成分进一步进行语义分析处理（计算），识别他们的含义，同时进行语义检查</li></ul></li><li>生成目标程序（<mark>后端：与目标机有关</mark>）<ul><li>代码生成：将源程序的中间形式转换为汇编语言或者机器语言</li><li>代码优化：在确保源代码功能不变的前提下，获得更高效的目标程序</li></ul></li><li>符号表管理：保存每个标识符及其属性信息，在符号表的表项中登录标识符的属性</li><li>出错处理：检测错误，向用户报错错误性质和位置，以便用户修改源程序</li></ul><h1 id="2-文法和语言"><a class="markdownIt-Anchor" href="#2-文法和语言"></a> 2 文法和语言</h1><p>正闭包：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>A</mi><mo>+</mo></msup><mo>=</mo><msup><mi>A</mi><mn>1</mn></msup><mo>∪</mo><msup><mi>A</mi><mn>2</mn></msup><mo>∪</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo>∪</mo><msup><mi>A</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">A^+=A^1\cup A^2\cup ...\cup A^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.821331em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.821331em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8641079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8641079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.55556em;vertical-align:0em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.7143919999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span></p><p>闭包：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>A</mi><mo>∗</mo></msup><mo>=</mo><msup><mi>A</mi><mn>0</mn></msup><mo>∪</mo><msup><mi>A</mi><mo>+</mo></msup></mrow><annotation encoding="application/x-tex">A^*=A^0\cup A^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8641079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.821331em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.821331em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span></span></span></span></span></p><blockquote><p>Q：为什么对符号、符号串、符号串集合以及它们的运算感兴趣？</p><p>A：把单词看作符号，句子便是符号串。而所有句子的集合就是符号串集合。</p></blockquote><h2 id="文法的非形式定义"><a class="markdownIt-Anchor" href="#文法的非形式定义"></a> 文法的非形式定义</h2><blockquote><p>对语言结构的定义与描述，也称语法。</p></blockquote><p>语法规则：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>:</mo><mo>=</mo><mo>=</mo></mrow><annotation encoding="application/x-tex">:==</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span></span></span></span>表示“由…组成”。</p><p>由规则推导句子：从一个要识别的符号开始推导，用相应规则的右部替代规则的左部，每次仅用一条，<strong>直到所有带&lt;&gt;的非终结符号都被终结符号替代</strong>。</p><p><mark>最左归约=最右推导=规范推导</mark></p><p>推导序列：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409120907414.png" alt="image-20240912090751388" /></p><ul><li>最左推导：从最左的语法成分进行推导</li><li>最右推导：同理</li></ul><p><mark>文法是在形式上对句子结构的定义与描述，未涉及语义</mark></p><p>语法推导树：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409120908250.png" alt="image-20240912090839201" /></p><h2 id="文法和语言的形式定义"><a class="markdownIt-Anchor" href="#文法和语言的形式定义"></a> 文法和语言的形式定义</h2><h3 id="文法"><a class="markdownIt-Anchor" href="#文法"></a> 文法</h3><p>文法：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><msub><mi>V</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>P</mi><mo separator="true">,</mo><mi>Z</mi><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><msub><mi>V</mi><mi>n</mi></msub><mo>:</mo><mi mathvariant="normal">非</mi><mi mathvariant="normal">终</mi><mi mathvariant="normal">结</mi><mi mathvariant="normal">符</mi><mi mathvariant="normal">号</mi><mi mathvariant="normal">集</mi><mspace linebreak="newline"></mspace><msub><mi>V</mi><mi>t</mi></msub><mo>:</mo><mi mathvariant="normal">终</mi><mi mathvariant="normal">结</mi><mi mathvariant="normal">符</mi><mi mathvariant="normal">号</mi><mi mathvariant="normal">集</mi><mspace linebreak="newline"></mspace><mi>V</mi><mo>=</mo><msub><mi>V</mi><mi>n</mi></msub><mo>+</mo><msub><mi>V</mi><mi>t</mi></msub><mo>:</mo><mi mathvariant="normal">文</mi><mi mathvariant="normal">法</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">字</mi><mi mathvariant="normal">汇</mi><mi mathvariant="normal">表</mi><mspace linebreak="newline"></mspace><mi>P</mi><mo>:</mo><mi mathvariant="normal">产</mi><mi mathvariant="normal">生</mi><mi mathvariant="normal">式</mi><mi mathvariant="normal">或</mi><mi mathvariant="normal">规</mi><mi mathvariant="normal">则</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">结</mi><mi mathvariant="normal">合</mi><mspace linebreak="newline"></mspace><mi>Z</mi><mo>:</mo><mi mathvariant="normal">开</mi><mi mathvariant="normal">始</mi><mi mathvariant="normal">符</mi><mi mathvariant="normal">号</mi><mi mathvariant="normal">，</mi><mi>Z</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">G=(V_n,V_t,P,Z)\\V_n:非终结符号集\\V_t:终结符号集\\V=V_n+V_t:文法的字汇表\\P:产生式或规则的结合\\Z:开始符号，Z\in V_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">非</span><span class="mord cjk_fallback">终</span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">符</span><span class="mord cjk_fallback">号</span><span class="mord cjk_fallback">集</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">终</span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">符</span><span class="mord cjk_fallback">号</span><span class="mord cjk_fallback">集</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">文</span><span class="mord cjk_fallback">法</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">字</span><span class="mord cjk_fallback">汇</span><span class="mord cjk_fallback">表</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">生</span><span class="mord cjk_fallback">式</span><span class="mord cjk_fallback">或</span><span class="mord cjk_fallback">规</span><span class="mord cjk_fallback">则</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">合</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord cjk_fallback">开</span><span class="mord cjk_fallback">始</span><span class="mord cjk_fallback">符</span><span class="mord cjk_fallback">号</span><span class="mord cjk_fallback">，</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>规则：有序对（U，x）。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>→</mo><mi>x</mi></mrow><annotation encoding="application/x-tex">U\rightarrow x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">x</span></span></span></span></p><p>文法的 BNF 表示（或）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>y</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">∣</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">U::=x|y|...|z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span></span></span></span></span></p><h4 id="推导"><a class="markdownIt-Anchor" href="#推导"></a> 推导</h4><ul><li>直接推导：使用一次规则即可推导出</li><li>间接推导：存在一个直接推导序列，<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409171510482.png" alt="image-20240917151020396" style="zoom:50%;" /></li><li>最左/右推导：总是从最左/右的语法成分进行推导</li><li>规范推导就是最右推导（<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>∈</mo><msubsup><mi>V</mi><mi>t</mi><mo>∗</mo></msubsup></mrow><annotation encoding="application/x-tex">y\in V_t^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.935696em;vertical-align:-0.247em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-2.4530000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span>说明 y 一定是终结符号，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi></mrow><annotation encoding="application/x-tex">U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>一定是右边第一个非终结符号）<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409171512336.png" alt="image-20240917151222306" /></li></ul><p>通过若干步推导（可以是 0）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409171517950.png" alt="image-20240917151534329" /></p><h3 id="语言"><a class="markdownIt-Anchor" href="#语言"></a> 语言</h3><ol><li>句型：如果可以通过若干步推导出 x（可以包含终结符，也可以包含非终结符，也可以是空串）</li><li>句子：不包含终结符的句型</li><li>语言：由文法 G 生成的所有句子集合</li></ol><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409120929932.png" alt="image-20240912092957897" /></p><p>形式语言理论证明以下两点：</p><p>（1）<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mo>→</mo><mi>L</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G\rightarrow L(G)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mclose">)</span></span></span></span>：已知文法，求语言，通过推导</p><p>（2）<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">)</mo><mo>→</mo><msub><mi>G</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>G</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>G</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">L(G)\rightarrow G_1,G_2,...,G_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：已知语言，构造文法，凭经验</p><blockquote><p>已知语言，构造文法：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">{</mo><mi>a</mi><msup><mi>b</mi><mi>n</mi></msup><mi>a</mi><mi mathvariant="normal">∣</mi><mi>n</mi><mo>≥</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{ab^na |n\geq1\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mord mathdefault">a</span><span class="mord">∣</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>G</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>Z</mi><mo stretchy="false">]</mo><mo>:</mo><mi>Z</mi><mo>→</mo><mi>a</mi><mi>B</mi><mi>a</mi><mo separator="true">,</mo><mi>B</mi><mo>→</mo><mi>b</mi><mi mathvariant="normal">∣</mi><mi>b</mi><mi>B</mi><mspace linebreak="newline"></mspace><msub><mi>G</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>Z</mi><mo stretchy="false">]</mo><mo>:</mo><mi>Z</mi><mo>→</mo><mi>a</mi><mi>B</mi><mi>a</mi><mo separator="true">,</mo><mi>B</mi><mo>→</mo><mi>b</mi><mi mathvariant="normal">∣</mi><mi>B</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">G_1[Z]:Z\rightarrow aBa,B\rightarrow b|bB\\G_2[Z]:Z\rightarrow aBa,B\rightarrow b|Bb</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mord">∣</span><span class="mord mathdefault">b</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault">b</span></span></span></span></span></p><p>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">)</mo><mo>=</mo><mi>L</mi><mo stretchy="false">(</mo><msup><mi>G</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">L(G)=L(G&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi></mrow><annotation encoding="application/x-tex">G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>G</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">G&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>为等价文法。</p><p><mark>证明等价文法可转化为证明集合等价</mark></p></blockquote><h4 id="递归文法"><a class="markdownIt-Anchor" href="#递归文法"></a> 递归文法</h4><p>可用有穷条规则，定义无穷语言。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409121006517.png" alt="image-20240912100623468" /></p><h4 id="句型的短语-简单短语和句柄"><a class="markdownIt-Anchor" href="#句型的短语-简单短语和句柄"></a> 句型的短语、简单短语和句柄</h4><p><strong>相对于句型而言！！！</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409171526412.png" alt="image-20240917152605376" /></p><ol><li><p>短语：前面句型中的某个非终结符所能推出的符号串，由每颗子树的叶子组成</p><p><mark>任何句型本身一定是相对于识别符号 Z 的短语</mark></p><p><img src="https://img2018.cnblogs.com/blog/1483449/201906/1483449-20190621214719278-2019466211.png" alt="" /></p><p><img src="https://img2018.cnblogs.com/blog/1483449/201906/1483449-20190621214726660-1595534738.png" alt="" /></p></li><li><p>简单子树：树的高度为两层的子树</p></li><li><p>简单短语：简单子树的叶子结点</p></li><li><p>句柄：最左简单短语，最左简单子树的叶子</p></li></ol><h2 id="语法树与二义性文法"><a class="markdownIt-Anchor" href="#语法树与二义性文法"></a> 语法树与二义性文法</h2><h3 id="推导与语法推导树"><a class="markdownIt-Anchor" href="#推导与语法推导树"></a> 推导与语法推导树</h3><p>语法推导树：根结点——识别符号，中间结点——非终结符，叶结点——终结符</p><p>子树：某个结点连同向下生长的部分</p><p>规范归约：对句型中==最左简单短语（句柄）==进行的归约</p><h3 id="二义性"><a class="markdownIt-Anchor" href="#二义性"></a> 二义性</h3><blockquote><p>若对于一个文法的某一个句子，存在两颗不同的语法树，即存在着两个不同的规范推导（不同的句柄），则是二义性文法</p></blockquote><p><mark>二义性：句柄不唯一</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409171535664.png" alt="image-20240917153517619" /></p><p><mark>二义性不可通过有限步骤判定</mark></p><blockquote><p>扩充的 BNF 表示：</p><ul><li>花括号{}使用：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">{</mo><mi>t</mi><msubsup><mo stretchy="false">}</mo><mi>n</mi><mi>m</mi></msubsup></mrow><annotation encoding="application/x-tex">\{t\}^m_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">t</span><span class="mclose"><span class="mclose">}</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-2.4530000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span>表示符号串 t 可自重复连接 n 到 m 次，如果省略 n、m，表示可连接 0-任意多次</li><li>方括号[]使用：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>t</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[t]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">t</span><span class="mclose">]</span></span></span></span>表示符号串 t 可有可无</li><li>圆括号()使用：在规则中提取因子<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mi>z</mi><mo>=</mo><mi>x</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">xy|xw|xz=x(y|w|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span></li></ul></blockquote><p><strong>有关文法的实用限制</strong></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">U::=U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>这样的规则即为有害规则。</p><p>如果文法中无有害规则或多余规则，则称文法是压缩过的。</p><p><strong>文法和语言分类</strong></p><ul><li><p>0 型：短语结构文法，左部右部均可以是符号串，一个短语可以产生另一个短语，可被图灵机接受</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>u</mi><mo>→</mo><mi>v</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>+</mo></msup><mo separator="true">,</mo><mi>V</mi><mo>=</mo><msub><mi>V</mi><mi>n</mi></msub><mo>∪</mo><msub><mi>V</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">P:u\rightarrow v,其中u\in V^+,V=V_n\cup V_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.015771em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.821331em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>1 型：上下文有关，只有在 x，y 的情况下才可以改写，由线性界限自动机</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>x</mi><mi>U</mi><mi>y</mi><mo>→</mo><mi>x</mi><mi>u</mi><mi>y</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>U</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">P:xUy\rightarrow xuy,其中U\in V_n,x,y,u\in V^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>2 型：上下文无关文法，1 型文法<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo separator="true">,</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x,y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，由下推自动机接受</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>U</mi><mo>→</mo><mi>u</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>U</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">P:U\rightarrow u,其中U\in V_n,u\in V^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>3 型：由有穷自动机接受<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291703041.png" alt="image-20241129170313345" /></p></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291704436.png" alt="image-20241129170345770" /></p><h1 id="3-词法分析"><a class="markdownIt-Anchor" href="#3-词法分析"></a> 3 词法分析</h1><blockquote><p>识别单词，返回单词的类别和值</p></blockquote><p>词法分析程序的功能：</p><ul><li>词法分析：根据词法规则识别及组合单词，进行词法检查</li><li>对数字常数完成数字字符串到二进制数值的转化</li><li>删去空格和注释</li></ul><p>实现方案：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409161013833.png" alt="image-20240916101309712" /></p><p>保存单词：类别编码，单词值</p><h2 id="正则文法和状态图"><a class="markdownIt-Anchor" href="#正则文法和状态图"></a> 正则文法和状态图</h2><h3 id="画状态图"><a class="markdownIt-Anchor" href="#画状态图"></a> 画状态图</h3><p><mark>自底向上，规约过程</mark></p><ul><li>每个非终结符设一个状态，并设置开始状态 S</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Q</mi><mo>→</mo><mi>T</mi><mo separator="true">,</mo><mi>Q</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>T</mi><mo>∈</mo><msub><mi>V</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">Q\rightarrow T,Q\in V_n,T\in V_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291730281.png" alt="image-20241129173050231" style="zoom: 33%;" /></li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Q</mi><mo>→</mo><mi>R</mi><mi>T</mi><mo separator="true">,</mo><mi>R</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>T</mi><mo>∈</mo><msub><mi>V</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">Q\rightarrow RT,R\in V_n,T\in V_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291731048.png" alt="image-20241129173141000" style="zoom:33%;" /></li><li>增加终止状态标志（双圈）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231035365.png" alt="image-20241023103510253" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291737171.png" alt="image-20241129173721121" /></p><h2 id="构造词法分析程序"><a class="markdownIt-Anchor" href="#构造词法分析程序"></a> 构造词法分析程序</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291739774.png" alt="image-20241129173915717" /></p><h1 id="4-语法分析"><a class="markdownIt-Anchor" href="#4-语法分析"></a> 4 语法分析</h1><blockquote><p>根据文法规则，从源程序单词符号串中识别出语法成分，并进行语法检查</p></blockquote><h2 id="自顶向下分析"><a class="markdownIt-Anchor" href="#自顶向下分析"></a> 自顶向下分析</h2><blockquote><p>主要问题：</p><ul><li>左递归问题：不能直接处理具有左递归性的文法</li><li>回溯问题：消耗时间</li></ul><p>主要方法：</p><ul><li>递归子程序法</li><li>LL 分析法</li></ul></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409201516934.png" alt="image-20240920151625851" /></p><blockquote><p>给定符号串 S 若预测是某一语法成分，则可根据该语法成分的文法，设法为 S 构造一颗语法树，若成功，则 S 最终被识别为某一语法成分，即<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mo>∈</mo><mi>L</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">[</mo><mi>Z</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S\in L(G[Z])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">]</span><span class="mclose">)</span></span></span></span>，其中<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mo stretchy="false">[</mo><mi>Z</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">G[Z]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">G</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">]</span></span></span></span>为某语法成分的文法，若不成功，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mi mathvariant="normal">∉</mi><mi>L</mi><mo stretchy="false">(</mo><mi>G</mi><mo stretchy="false">[</mo><mi>Z</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S\notin L(G[Z])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="llap"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace" style="margin-right:0.05555555555555555em;"></span></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.25em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mclose">]</span><span class="mclose">)</span></span></span></span></p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409221630180.png" alt="image-20240922163013082" /></p><h3 id="存在问题"><a class="markdownIt-Anchor" href="#存在问题"></a> 存在问题</h3><h4 id="左递归问题"><a class="markdownIt-Anchor" href="#左递归问题"></a> 左递归问题</h4><blockquote><p>不能处理具有左递归性的文法，必须要消除文法的左递归。</p></blockquote><p><strong>消除左递归</strong>：</p><ol><li><p>（提因子）<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>x</mi><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">U::=xy|xw|xz</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span></span></span></span> 可替换为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>x</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">U::=x(y|w|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span></p><p>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>→</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">U\rightarrow x|xy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，应该写为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>→</mo><mi>x</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>ε</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">U\rightarrow x(y|\varepsilon)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">ε</span><span class="mclose">)</span></span></span></span>。</p></li><li><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>y</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mi mathvariant="normal">∣</mi><mi>U</mi><mi>v</mi></mrow><annotation encoding="application/x-tex">U::=x|y|...|z|Uv</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span></span></span></span> 可替换为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>y</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo><mo stretchy="false">{</mo><mi>v</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">U::=(x|y|...|z)\{v\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mclose">}</span></span></span></span>，将具有直接左递归的右部选择位于最后可取无限次</p></li><li><p>左递归改为右递归<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409221647967.png" alt="image-20240922164654014" /></p></li><li><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409221655034.png" alt="image-20240922165545003" /></p></li></ol><h4 id="回溯问题"><a class="markdownIt-Anchor" href="#回溯问题"></a> 回溯问题</h4><blockquote><p>避免回溯必须保证：对文法的任何非终结符号，特别是对那些规则右部有多个选择的非终结符号，当要用它去匹配输入串时，它能够根据所面临的输入符号准确的用齐规则右部的某一个选择去执行任务，并且工作的结果应是确信无疑的。</p></blockquote><p>定义任一个选择<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">a_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>所可能推出的终结符号串的首符号集<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FIRST(a_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>需要满足：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>∩</mo><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mi>j</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi><mo stretchy="false">(</mo><mi>i</mi><mi mathvariant="normal">≠</mi><mi>j</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FIRST(A_i)\cap FIRST(a_j)=\emptyset(i\neq j)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∅</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mclose">)</span></span></span></span></span></p><p><strong>消除回溯：</strong></p><ol><li>改写文法：对具有多个右部的规则反复提取左因子<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409221721447.png" alt="image-20240922172141399" /></li><li>超前扫描：若各选择的首符号相交，向前侦查各输入符号串的第二个、第三个来确定要选择的目标<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409221723881.png" alt="image-20240922172342826" /></li></ol><p>为了不采取超前扫描的前提下实现不带回溯的自顶向下分析，需要满足两个条件：</p><ul><li>文法非左递归</li><li>对文法的任一非终结符，若其规则右部有多个选择时，各个选择所推出的终结符号的首符号集要两两不相交</li></ul><p>不带回溯的充分必要条件：对于 G 的每个非终结符 A 的任意两条规则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>α</mi><mi mathvariant="normal">∣</mi><mi>β</mi></mrow><annotation encoding="application/x-tex">A::=\alpha|\beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span></span></span></span></p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><mi>α</mi><mo stretchy="false">)</mo><mo>∩</mo><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><mi>β</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">FIRST(\alpha)\cap FIRST(\beta)=\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>β</mi><mo>→</mo><mi>ϵ</mi></mrow><annotation encoding="application/x-tex">\beta\rightarrow\epsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ϵ</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><mi>α</mi><mo stretchy="false">)</mo><mo>∩</mo><mi>F</mi><mi>O</mi><mi>L</mi><mi>L</mi><mi>O</mi><mi>W</mi><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">FIRST(\alpha)\cap FOLLOW(A)=\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">L</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></li></ul><h3 id="递归下降子程序法"><a class="markdownIt-Anchor" href="#递归下降子程序法"></a> 递归下降子程序法</h3><blockquote><p>对每一个非终结符都编一个分析程序，当根据文法和当时的输入符号预测到要用某个非终结符区匹配输入串时，就调用该非终结符的分析程序</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231113520.png" alt="image-20241023111322458" /></p><h2 id="自底向上分析"><a class="markdownIt-Anchor" href="#自底向上分析"></a> 自底向上分析</h2><blockquote><p>主要问题：</p><ul><li>句柄的识别问题</li></ul><p>主要方法：</p><ul><li>算符优先分析法</li><li>LR 分析法</li></ul></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291847149.png" alt="image-20241129184715105" /></p><h1 id="5-符号表管理技术"><a class="markdownIt-Anchor" href="#5-符号表管理技术"></a> 5 符号表管理技术</h1><h2 id="概述"><a class="markdownIt-Anchor" href="#概述"></a> 概述</h2><blockquote><p>符号表：编译程序用来记录源程序中各种名字的特性信息</p><p>名字：程序名、过程名、函数名、用户定义类型名、变量名…</p><p>特性信息：种类、类型、维数、参数个数</p><p><strong>建表和查表的必要性</strong>：</p><ol><li>变量声明时，将名字及其信息登录到符号表中，同时给变量分配存储单元，并将存储单元地址登录在符号表中</li><li>当编译到引用变量的位置时，需要查符号表取得相关信息</li></ol></blockquote><ul><li>填表：说明|定义语句时，将名字和信息填入符号表中</li><li>查表：<ul><li>检查同一作用域内名字是否重复定义</li><li>检查名字的种类与说明是否一致</li><li>对于强类型语言，检查表达式中各变量的类型是否一致</li><li>生成目标指令时，取得所需要的地址</li></ul></li></ul><h2 id="符号表的组织与内容"><a class="markdownIt-Anchor" href="#符号表的组织与内容"></a> 符号表的组织与内容</h2><table><thead><tr><th>名字</th><th>特性信息</th></tr></thead><tbody><tr><td></td><td>种类（简单变量、函数、过程、数组、标号、参数）<br/>类型（整形、浮点型、字符型、指针）<br/>性质（变量形参、值形参）<br/>值<br/>地址<br/>大小</td></tr></tbody></table><p>组织形式：</p><ul><li>统一符号表：按信息量最大的设计，浪费空间</li><li>不同种类的名字分别建立：节省空间，但查表不便</li><li>这种：大部分在一张表，特殊信息另设附表，用指针连接</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409222122115.png" alt="image-20240922212130510" /></p><h2 id="非分程序结构语言的符号表组织"><a class="markdownIt-Anchor" href="#非分程序结构语言的符号表组织"></a> 非分程序结构语言的符号表组织</h2><blockquote><p>非分程序结构语言：每个可独立进行编译的程序单元是一个不包含有子模块的单一模块（所有标识符属于整个模块）</p></blockquote><h3 id="标识符"><a class="markdownIt-Anchor" href="#标识符"></a> 标识符</h3><p>作用域：</p><ul><li>全局：子程序名，函数名和公共区名</li><li>局部：程序单元中定义的变量</li></ul><p>组织：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409222149320.png" alt="image-20240922214928291" /></p><p>处理办法：</p><ul><li>子程序、函数名和公共区名填入全局符号表</li><li>在子程序声明部分读到标识符，造局部符号表<ul><li>检查是否同名</li></ul></li><li>在语句部分读到标识符，查表<ul><li>有局部表</li><li>无，查全局表——有即全局变量，无即没有定义</li></ul></li><li>程序单元结束：释放局部符号表</li><li>程序编译完成：释放全部符号表</li></ul><h3 id="组织方式"><a class="markdownIt-Anchor" href="#组织方式"></a> 组织方式</h3><ul><li>无序符号表：按扫描顺序建表，逐项查找<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n+1}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>有序符号表：按变量名字典式排序<ul><li>线性查表：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n+1}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>折半查表：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mo><mi>log</mi><mo>⁡</mo></mo><mn>2</mn></msub><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\log_2n -1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.93858em;vertical-align:-0.24414em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.20696799999999996em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span></li><li>Hash 表：符号表地址=Hash(标识符)。<mark>解决冲突</mark></li></ul></li></ul><h2 id="分程序结构语言的符号表组织"><a class="markdownIt-Anchor" href="#分程序结构语言的符号表组织"></a> 分程序结构语言的符号表组织</h2><blockquote><p>分程序结构语言：模块内可嵌入子模块</p></blockquote><p>处理办法：</p><ul><li><p>建查符号表要遵循标识符的作用域规定进行</p></li><li><p>建表：不能重复，不能遗漏</p></li><li><p>查表：按标识符作用域</p></li><li><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409222209703.png" alt="image-20240922220900659" /></p></li><li><p>程序声明部分读到标识符：</p><ul><li>查本层符号表有无同名，有——重复声明报错，无——填入符号表</li></ul></li><li><p>在语句中读到标识符：</p><ul><li>查本层符号表有无同名，有——已声明（局部量），无——是否是最外层，是——报错，否——转到外层（n-1）</li></ul></li><li><p>标准标识符的处理（不必声明可全程使用）</p><ul><li>单独建表|预先填入最外层</li></ul></li></ul><h3 id="栈式符号表"><a class="markdownIt-Anchor" href="#栈式符号表"></a> 栈式符号表</h3><p>当到达分程序结尾时，就弹出分程序的符号表。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409222222308.png" alt="image-20240922222221248" /></p><p>分程序索引表指向每个分程序的开始（分程序名属于上一层符号表）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202409222222540.png" alt="image-20240922222235482" /></p><h1 id="6-运行时的存储组织及管理"><a class="markdownIt-Anchor" href="#6-运行时的存储组织及管理"></a> 6 运行时的存储组织及管理</h1><blockquote><p>目标程序运行时所需存储空间的组织与管理以及源程序中变量存储空间的分配</p></blockquote><h2 id="静态存储分配"><a class="markdownIt-Anchor" href="#静态存储分配"></a> 静态存储分配</h2><blockquote><p>在<strong>编译阶段</strong>就可以确定变量在运行时的空间大小且不改变（但并不是所有数据空间大小都能在编译过程中确定—&gt;动态存储分配）</p></blockquote><p>目标地址：绝对地址（单任务环境）|相对地址</p><ul><li>开辟数据区（首地址加载时定）</li><li>按编译顺序给每个模块分配存储空间</li><li>在模块内部按顺序给变量分配存储，大小由类型决定</li><li>目标地址填入符号表</li></ul><p>FORTRAN 子程序完整数据区：</p><ul><li>变量</li><li>返回地址</li><li>形式参数</li><li>临时变量</li></ul><h2 id="动态存储分配"><a class="markdownIt-Anchor" href="#动态存储分配"></a> 动态存储分配</h2><blockquote><p>在<strong>目标程序运行</strong>时才分配，比如递归程序</p></blockquote><p><mark>栈式动态存储分配</mark></p><ul><li>进入一个过程时，在栈顶分配一个数据区</li><li>退出时撤销数据区</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301705619.png" alt="image-20241130170555549" /></p><p>从 M1(X/Y)处调用 M1，然后进入 AR2 数据区，…，然后依次退出，撤销数据区</p><h3 id="活动记录"><a class="markdownIt-Anchor" href="#活动记录"></a> 活动记录</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231439368.png" alt="image-20241023143920334" /></p><h4 id="局部数据区"><a class="markdownIt-Anchor" href="#局部数据区"></a> 局部数据区</h4><blockquote><p>存放模块中定义的各个局部变量</p></blockquote><h4 id="参数区"><a class="markdownIt-Anchor" href="#参数区"></a> 参数区</h4><blockquote><p>存放隐式参数和显式参数</p></blockquote><p>显式参数：形参数据区</p><p>隐式参数：</p><ul><li><code>prev abp</code>：存放调用模块记录基地址，函数执行完时，释放其数据区，数据区指针指向调用前的位置（前一个作用域）</li><li><code>ret addr</code>：返回地址，调用语句的下一条执行指令地址</li><li><code>ret value</code>：函数返回值，无则空</li></ul><h4 id="display-区"><a class="markdownIt-Anchor" href="#display-区"></a> display 区</h4><blockquote><p>存放<strong>各外层模块</strong>活动记录的基地址，为了访问外层变量。</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301711302.png" alt="image-20241130171132252" /></p><p>变量二元地址：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>B</mi><mi>L</mi><mi mathvariant="normal">、</mi><mi>O</mi><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(BL、ON)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault">L</span><span class="mord cjk_fallback">、</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>。</p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>L</mi></mrow><annotation encoding="application/x-tex">BL</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault">L</span></span></span></span>：变量声明所在的层次，可得到该层数据区开始地址</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mi>N</mi></mrow><annotation encoding="application/x-tex">ON</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span></span>：相对于显式参数区的开始位置的位移，即相对地址</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231548541.png" alt="image-20241023154842485" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231549040.png" alt="image-20241023154859982" /></p><p>当模块 4 执行完，就将<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mi>b</mi><mi>p</mi><mo>=</mo><mi>p</mi><mi>r</mi><mi>e</mi><mi>v</mi><mtext> </mtext><mi>a</mi><mi>b</mi><mi>p</mi></mrow><annotation encoding="application/x-tex">abp=prev\ abp</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mspace"> </span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span></span></span></span>，然后就恢复到进入模块 4 的情况。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301821342.png" alt="image-20241130182141262" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301822347.png" alt="image-20241130182205278" /></p><h3 id="建造-display-区的规则"><a class="markdownIt-Anchor" href="#建造-display-区的规则"></a> 建造 display 区的规则</h3><p>从<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>层模块调用<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>层模块：</p><ul><li><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">j=i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>：复制<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>层的 display，在增加一个指向<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>层的基地址指针</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301823691.png" alt="image-20241130182304649" /></p></li><li><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>j</mi><mo>≤</mo><mi>i</mi></mrow><annotation encoding="application/x-tex">j\leq i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>：将<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>层模块的 display 区前面的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>j</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">j-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>个复制到第<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>层</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301823141.png" alt="image-20241130182341092" /></p></li></ul><h3 id="运行时的地址计算"><a class="markdownIt-Anchor" href="#运行时的地址计算"></a> 运行时的地址计算</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231555919.png" alt="image-20241023155536866" /></p><h1 id="7-源程序的中间形式"><a class="markdownIt-Anchor" href="#7-源程序的中间形式"></a> 7 源程序的中间形式</h1><h2 id="波兰表示"><a class="markdownIt-Anchor" href="#波兰表示"></a> 波兰表示</h2><blockquote><p>设一个操作符栈，如果是操作数则立即输出，如果是操作符则与栈顶比较（空栈优先级最低），如果栈顶优先级更高则输出栈顶，反之则压入栈中。</p></blockquote><p>语法树角度：后序遍历</p><h3 id="if-语句"><a class="markdownIt-Anchor" href="#if-语句"></a> if 语句</h3><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>f</mi><mo>&lt;</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>&gt;</mo><mi>t</mi><mi>h</mi><mi>e</mi><mi>n</mi><mo>&lt;</mo><mi>s</mi><mi>t</mi><mi>m</mi><msub><mi>t</mi><mn>1</mn></msub><mo>&gt;</mo><mi>e</mi><mi>l</mi><mi>s</mi><mi>e</mi><mo>&lt;</mo><mi>s</mi><mi>t</mi><mi>m</mi><msub><mi>t</mi><mn>2</mn></msub><mo>&gt;</mo></mrow><annotation encoding="application/x-tex">if&lt;expr&gt;then&lt;stmt_1&gt;else&lt;stmt_2&gt;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.73354em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault">h</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord mathdefault">s</span><span class="mord mathdefault">t</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.73354em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord mathdefault">s</span><span class="mord mathdefault">t</span><span class="mord mathdefault">m</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231628714.png" alt="image-20241023162810674" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231629485.png" alt="image-20241023162905435" /></p><h3 id="中间代码生成"><a class="markdownIt-Anchor" href="#中间代码生成"></a> 中间代码生成</h3><p>expr 结束有跳到 else 的标签，stmt1 结束有跳到 if-else 结束的标签</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411301942328.png" alt="image-20241130194243257" /></p><h2 id="n-元表示"><a class="markdownIt-Anchor" href="#n-元表示"></a> N-元表示</h2><h3 id="三元式"><a class="markdownIt-Anchor" href="#三元式"></a> 三元式</h3><table><thead><tr><th>操作符</th><th>左操作数</th><th>右操作数</th></tr></thead><tbody><tr><td>+</td><td>x</td><td>y</td></tr></tbody></table><p>直接三元式即使式子重复也要重新写出，间接三元式则省略重复直接复用</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231641546.png" alt="image-20241023164118491" /></p><h3 id="四元式"><a class="markdownIt-Anchor" href="#四元式"></a> 四元式</h3><table><thead><tr><th>操作符</th><th>操作数 1</th><th>操作数 2</th><th>结果</th></tr></thead><tbody><tr><td></td><td></td><td></td><td>通常是由编译引入的临时变量，可由编译程序分配一个寄存器或主存单元，一般用 T1~T4</td></tr></tbody></table><h2 id="中间代码的图表示"><a class="markdownIt-Anchor" href="#中间代码的图表示"></a> 中间代码的图表示</h2><h3 id="抽象语法树"><a class="markdownIt-Anchor" href="#抽象语法树"></a> 抽象语法树</h3><blockquote><p>操作数出现在叶节点，操作符出现在中间节点</p></blockquote><p>抽象语法树与三元式的关系：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231644311.png" alt="image-20241023164420241" /></p><h3 id="dag-图"><a class="markdownIt-Anchor" href="#dag-图"></a> DAG 图</h3><blockquote><p>有向无环图</p></blockquote><p>抽象语法树—&gt;DAG（删去多余支）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231645792.png" alt="image-20241023164513738" /></p><h2 id="ssa"><a class="markdownIt-Anchor" href="#ssa"></a> SSA</h2><p><strong>每个变量只赋值一次</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171009012.png" alt="image-20241217100927879" /></p><h1 id="8-错误处理"><a class="markdownIt-Anchor" href="#8-错误处理"></a> 8 错误处理</h1><h2 id="概述-2"><a class="markdownIt-Anchor" href="#概述-2"></a> 概述</h2><p>正确的源程序：通过编译生成中间代码</p><p>错误的源程序：通过编译发现并指出错误</p><p>错误处理能力：</p><ul><li>诊察错误的能力</li><li>报错及时准确</li><li>一次编译找出错误的多少</li><li>错误的改正能力</li><li>遏止重复的错误信息的能力</li></ul><h2 id="错误分类"><a class="markdownIt-Anchor" href="#错误分类"></a> 错误分类</h2><p>错误分为两类：</p><ul><li>语法错误：源程序不合乎文法</li><li>语义错误：程序不符合语义规则或超越具体计算机系统的限制，<mark>将运行时错误也划分在语义错误范畴内</mark></li></ul><blockquote><p>语义规则：</p><ul><li>标识符引用要符合作用域规定</li><li>标识符先说明后引用</li><li>参与运算的操作数类型一致</li><li>过程调用时实参与形参要一致</li><li>下标变量下标不能越界</li></ul><p>超越系统限制：</p><ul><li>数据溢出</li><li>符号表、静态存储分配数据区溢出</li><li>动态存储分配数据区溢出</li></ul></blockquote><h2 id="错误诊察和报告"><a class="markdownIt-Anchor" href="#错误诊察和报告"></a> 错误诊察和报告</h2><h3 id="错误诊察"><a class="markdownIt-Anchor" href="#错误诊察"></a> 错误诊察</h3><ol><li>违反语法和语义规则以及超过编译系统限制的错误（编译程序：语法和语义分析）</li><li>下标越界，计算结果溢出以及动态存储数据区溢出（目标程序：目标程序运行时）</li></ol><h3 id="错误报告"><a class="markdownIt-Anchor" href="#错误报告"></a> 错误报告</h3><p>报告内容：</p><ul><li>出错位置：行号|单词序号</li><li>出错性质：文字信息|错误编码</li></ul><p>报告方式：</p><ul><li>分析完再报告</li><li>边分析边报告</li></ul><h2 id="错误处理技术"><a class="markdownIt-Anchor" href="#错误处理技术"></a> 错误处理技术</h2><blockquote><p>进行错误改正或错误局部化处理</p></blockquote><p>一般原则：诊察到错误，暂停对后面符号的分析，跳过错误</p><ul><li>词法分析：显示错误，并跳过该标识符</li><li>语法语义分析：跳过所在语法成分，从新语句继续往下</li></ul><p>错误局部化处理：将错误影响限制在局部范围内，避免错误扩散和影响程序其他部分的分析。一直跳到语句的右界符（eg：end）或语法程序的合法后继符号</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231530512.png" alt="image-20241023153021469" /></p><h1 id="9-语法制导翻译技术"><a class="markdownIt-Anchor" href="#9-语法制导翻译技术"></a> 9 语法制导翻译技术</h1><h2 id="翻译文法-tg-和语法制导翻译"><a class="markdownIt-Anchor" href="#翻译文法-tg-和语法制导翻译"></a> 翻译文法 TG 和语法制导翻译</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231651606.png" alt="image-20241023165115565" /></p><p>目标：将中缀表达式转化为逆波兰表示。</p><p>则翻译的任务是将上述文法插入相应的动作符号。<strong>在什么时候插入打印终结符号</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>E</mi><mo>→</mo><mi>E</mi><mo>+</mo><mi>T</mi><mi mathvariant="normal">@</mi><mo>+</mo></mrow><annotation encoding="application/x-tex">E\rightarrow E+T@+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord">@</span><span class="mord">+</span></span></span></span></span></p><p>以第一个为例，表示处理 E，读+，处理 T 并打印+。</p><p>同理：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1.</mn><mi>E</mi><mo>→</mo><mi>E</mi><mo>+</mo><mi>T</mi><mi mathvariant="normal">@</mi><mo>+</mo><mspace linebreak="newline"></mspace><mn>2.</mn><mi>E</mi><mo>→</mo><mi>T</mi><mspace linebreak="newline"></mspace><mn>3.</mn><mi>T</mi><mo>→</mo><mi>T</mi><mo>∗</mo><mi>F</mi><mi mathvariant="normal">@</mi><mo>∗</mo><mspace linebreak="newline"></mspace><mn>4.</mn><mi>T</mi><mo>→</mo><mi>F</mi><mspace linebreak="newline"></mspace><mn>5.</mn><mi>F</mi><mo>→</mo><mo stretchy="false">(</mo><mi>E</mi><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mn>6.</mn><mi>F</mi><mo>→</mo><mi>i</mi><mi mathvariant="normal">@</mi><mi>i</mi></mrow><annotation encoding="application/x-tex">1.E\rightarrow E+T@+\\2.E\rightarrow T\\3.T\rightarrow T*F@*\\4.T\rightarrow F\\5.F\rightarrow(E)\\6.F\rightarrow i@i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord">@</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">3</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord">@</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">4</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">6</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mord">@</span><span class="mord mathdefault">i</span></span></span></span></span></p><ul><li>输入文法：未插入动作符号，可以推导产生输入序列</li><li>翻译文法：插入动作符号，可以推导产生活动序列（输入序列和动作序列）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412011609386.png" alt="image-20241201160834755" /></p><p>从活动序列中，抽去动作符号即得输入序列<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mi>i</mi><mo stretchy="false">)</mo><mo>∗</mo><mi>i</mi></mrow><annotation encoding="application/x-tex">(i+i)*i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>；抽去输入序列可得动作序列<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>i</mi><mo>+</mo><mi>i</mi><mo>∗</mo></mrow><annotation encoding="application/x-tex">ii+i*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mord">∗</span></span></span></span>。</p><p><strong>翻译文法是上下文无关文法，其终结符号集由输入符号和动作符号组成。由翻译文法所产生的终结符号串称为活动序列</strong></p><p><mark>语法制导翻译：按照翻译文法进行的翻译</mark></p><h2 id="属性翻译文法-atg"><a class="markdownIt-Anchor" href="#属性翻译文法-atg"></a> 属性翻译文法 ATG</h2><blockquote><p>在翻译文法的基础上，可以进一步定义属性文法，翻译文法中的号，包括终结符、非终结符和动作符号均可带有属性，这样能更好的描述和实现编译过程。属性即符号所具有的值部分</p></blockquote><h3 id="综合属性"><a class="markdownIt-Anchor" href="#综合属性"></a> 综合属性</h3><blockquote><p>综合属性：自底向上，自右向左求值（左边等于右边）</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231723524.png" alt="image-20241023172348473" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202410231724117.png" alt="image-20241023172412066" /></p><p>表示属性的求值过程：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412011617304.png" alt="image-20241201161735240" /></p><h3 id="继承属性"><a class="markdownIt-Anchor" href="#继承属性"></a> 继承属性</h3><blockquote><p>继承属性：自顶向下，自左向右</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412011631185.png" alt="image-20241201163148137" /></p><p>翻译文法目标：填符号表@set_table</p><p>填表需要的信息：类型 Type，名字 id，填的位置</p><p><strong>类型和名字在词法分析时得到，设为两个综合属性</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412011634544.png" alt="image-20241201163422493" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412011635132.png" alt="image-20241201163536070" /></p><h3 id="l-属性翻译文法-l-atg"><a class="markdownIt-Anchor" href="#l-属性翻译文法-l-atg"></a> L-属性翻译文法 L-ATG</h3><blockquote><p>输入文法要求是 LL(1) 文法，可用自顶向下分析构造分析器。在分析过程中可进行属性求 值。</p></blockquote><ul><li>终结符、非终结符及动作符号都带有属性，且每个属性都有值域</li><li>非终结符号及动作符号的属性可分为继承属性和综合属性</li><li>开始符号的继承属性具有指定的初始值</li><li>终结符号的每个综合属性都有指定的初始值</li><li>属性的求值规则<ul><li>继承属性：<mark>自顶向下，自左向右</mark><ul><li>左部非终结符号的属性值，取右部该符号已有的值</li><li>右部的属性值，用左部继承属性或出现在该符号左部的符号的属性值计算</li></ul></li><li>综合属性：<ul><li>右部非终结符号的属性值取其下部左部同名值</li><li>左部非终结符号的属性值，用产生式左部继承符号或右部属性</li></ul></li></ul></li></ul><h5 id="简单赋值形式的-l-属性翻译文法-sl-atg"><a class="markdownIt-Anchor" href="#简单赋值形式的-l-属性翻译文法-sl-atg"></a> 简单赋值形式的 L-属性翻译文法 SL-ATG</h5><ul><li>产生式右部继承符号是常量，等于左部符号的继承属性值或左边符号的综合属性值</li><li>左部综合属性是常量，等于左部继承属性值或等于右部综合属性值</li></ul><p>显然不是 SL-ATG，如何转化？</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031340602.png" alt="image-20241203133953500" /></p><p><strong>解：</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031341975.png" alt="image-20241203134114915" /></p><p>改写为：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031343913.png" alt="image-20241203134359847" /></p><h2 id="自顶向下语法制导翻译"><a class="markdownIt-Anchor" href="#自顶向下语法制导翻译"></a> 自顶向下语法制导翻译</h2><blockquote><p>翻译看成对偶的集合：第一个元素为输入序列，第二个元素为动作序列。如果按文法得到这种对偶时，称为语法制导翻译</p></blockquote><h3 id="递归下降翻译器"><a class="markdownIt-Anchor" href="#递归下降翻译器"></a> 递归下降翻译器</h3><p>只需在递归下降分析加上输出即可</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031349048.png" alt="image-20241203134923976" /></p><h3 id="递归下降属性翻译器"><a class="markdownIt-Anchor" href="#递归下降属性翻译器"></a> 递归下降属性翻译器</h3><p>对于每个非终结符号都编写一个翻译子程序，根据该非终结符号具有的属性数目，设置相应的参数。</p><ul><li>继承属性：赋值形参，继承属性值</li><li>综合属性：变量形参，属性变量名（传地址，返回时有值）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031432595.png" alt="image-20241203143200534" /></p><p>例子：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412031434792.png" alt="image-20241203143422743" /></p><p>【ppt：P38】</p><h1 id="10-语义分析和代码生成"><a class="markdownIt-Anchor" href="#10-语义分析和代码生成"></a> 10 语义分析和代码生成</h1><h2 id="语义分析的概念"><a class="markdownIt-Anchor" href="#语义分析的概念"></a> 语义分析的概念</h2><ul><li>上下文有关分析：标识符的作用域</li><li>类型的一致性检查</li><li>语义处理：<ul><li>声明语句：填符号表</li><li>执行语句：按某种操作的目标结构生成代码</li></ul></li></ul><p><strong>用上下文无关文法只能描述语法的语法结构，不能描述语义</strong></p><p>因此，通常我们把与语义相关的上下文有关信息填入符号表中，并通过查符号表中的这些信 息来分析程序的语义是否正确</p><h2 id="栈式抽象机及其汇编指令"><a class="markdownIt-Anchor" href="#栈式抽象机及其汇编指令"></a> 栈式抽象机及其汇编指令</h2><p>栈式抽象机：三个存储器、一个指令寄存器和多个地址寄存器</p><p>存储器：数据存储器（存放 AR 的运行栈），操作存储器（操作数栈），指令存储器</p><p>STN：栈底的值送到次栈底</p><h2 id="声明的处理"><a class="markdownIt-Anchor" href="#声明的处理"></a> 声明的处理</h2><p>主要任务：</p><ul><li>分离出每个被声明的实体，并把他们的名字填入符号表</li><li>把被声明实体的有关特性信息尽可能多的填入符号表</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412041530707.png" alt="image-20241204153013584" /></p><p>属性翻译文法：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412041539273.png" alt="image-20241204153959198" /></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">@</mi><mi>d</mi><mi>e</mi><mi>c</mi><mi mathvariant="normal">_</mi><mi>o</mi><msub><mi>n</mi><mrow><mo>↑</mo><mi>x</mi></mrow></msub></mrow><annotation encoding="application/x-tex">@dec\_on_{\uparrow x}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord">@</span><span class="mord mathdefault">d</span><span class="mord mathdefault">e</span><span class="mord mathdefault">c</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mrel mtight">↑</span><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span>：用于记录反填类型应该填到哪里</p><h3 id="常量"><a class="markdownIt-Anchor" href="#常量"></a> 常量</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412041544644.png" alt="image-20241204154439580" /></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">@</mi><mi>i</mi><mi>n</mi><mi>s</mi><mi>e</mi><mi>r</mi><msub><mi>t</mi><mrow><mo>↓</mo><mi>t</mi><mo separator="true">,</mo><mi>n</mi><mo separator="true">,</mo><mi>c</mi><mo separator="true">,</mo><mi>s</mi></mrow></msub></mrow><annotation encoding="application/x-tex">@insert_{\downarrow t,n,c,s}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord">@</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mrel mtight">↓</span><span class="mord mathdefault mtight">t</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">n</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">c</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span>：类别 t，名字 n，常量表达式值 c，常量表达式类别 s。</p><p>功能：</p><ul><li>检查声明的类型 t 和常量表达式的类型 s 是否一致</li><li>将名字 n，类型 t 和常量表达式的值 c 填入符号表</li></ul><h3 id="简单变量"><a class="markdownIt-Anchor" href="#简单变量"></a> 简单变量</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412041549232.png" alt="image-20241204154912163" /></p><p>对于变长字符串：</p><ul><li>动态申请存储空间，存储在堆中</li><li>通过指向存放该实体数据区的指针来引用该实体</li></ul><h3 id="数组变量"><a class="markdownIt-Anchor" href="#数组变量"></a> 数组变量</h3><p>LOC 是数组首地址，数组定义有上下界 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mo stretchy="false">[</mo><mi>L</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>U</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">B[L(1),U(1)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mopen">[</span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>D</mi><mi>D</mi><mi>R</mi><mo>=</mo><mi>L</mi><mi>O</mi><mi>C</mi><mo>+</mo><mo stretchy="false">(</mo><mi>x</mi><mo>−</mo><mi>L</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∗</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">ADDR=LOC+(x-L(1))*E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412041552340.png" alt="image-20241204155227232" /></p><h2 id="表达式的处理"><a class="markdownIt-Anchor" href="#表达式的处理"></a> 表达式的处理</h2><h2 id="赋值语句的处理"><a class="markdownIt-Anchor" href="#赋值语句的处理"></a> 赋值语句的处理</h2><h2 id="控制语句的处理"><a class="markdownIt-Anchor" href="#控制语句的处理"></a> 控制语句的处理</h2><h2 id="过程调用和返回"><a class="markdownIt-Anchor" href="#过程调用和返回"></a> 过程调用和返回</h2><h1 id="11-词法自动化"><a class="markdownIt-Anchor" href="#11-词法自动化"></a> 11 词法自动化</h1><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411260959867.png" alt="image-20241126095937762" /></p><h2 id="正则文法和正则表达式"><a class="markdownIt-Anchor" href="#正则文法和正则表达式"></a> 正则文法和正则表达式</h2><p>正则集合递归定义：</p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ϕ</span></span></span></span>都是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">Σ</mi></mrow><annotation encoding="application/x-tex">\Sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Σ</span></span></span></span>上的正则表达式，分别为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">{</mo><mi>ε</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{\varepsilon\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">ε</span><span class="mclose">}</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ϕ</mi></mrow><annotation encoding="application/x-tex">\phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ϕ</span></span></span></span></li><li>任何<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>∈</mo><mi mathvariant="normal">Σ</mi></mrow><annotation encoding="application/x-tex">a\in \Sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Σ</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span>是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">Σ</mi></mrow><annotation encoding="application/x-tex">\Sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Σ</span></span></span></span>上的正则表达式，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">{</mo><mi>a</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{a\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">a</span><span class="mclose">}</span></span></span></span></li><li>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>e</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">e_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>e</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">e_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">Σ</mi></mrow><annotation encoding="application/x-tex">\Sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Σ</span></span></span></span>是正则表达式，其正则集合分别为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>L</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">L_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>L</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">L_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则<ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><msub><mi>e</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mi mathvariant="normal">∣</mi><mo stretchy="false">(</mo><msub><mi>e</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(e_1)|(e_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord">∣</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> -&gt; <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>L</mi><mn>1</mn></msub><mo>∪</mo><msub><mi>L</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">L_1 \cup L_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><msub><mi>e</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo stretchy="false">(</mo><msub><mi>e</mi><mn>2</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(e_1)(e_2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> -&gt; <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>L</mi><mn>1</mn></msub><msub><mi>L</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">L_1L_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>e</mi><mn>1</mn><mo>∗</mo></msubsup></mrow><annotation encoding="application/x-tex">e_1^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.936804em;vertical-align:-0.24810799999999997em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-2.4518920000000004em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24810799999999997em;"><span></span></span></span></span></span></span></span></span></span> -&gt; <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>L</mi><mn>1</mn><mo>∗</mo></msubsup></mrow><annotation encoding="application/x-tex">L_1^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.936804em;vertical-align:-0.24810799999999997em;"></span><span class="mord"><span class="mord mathdefault">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-2.4518920000000004em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24810799999999997em;"><span></span></span></span></span></span></span></span></span></span></li></ul></li></ul><p>优先级：先*，后·，最后|</p><p><mark>正则表达式相等=正则表达式表示的语言相等</mark></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>b</mi><mo stretchy="false">{</mo><mi>a</mi><mi>b</mi><mo stretchy="false">}</mo><mo>=</mo><mo stretchy="false">{</mo><mi>b</mi><mi>a</mi><mo stretchy="false">}</mo><mi>b</mi><mspace linebreak="newline"></mspace><mo stretchy="false">{</mo><mi>a</mi><mi mathvariant="normal">∣</mi><mi>b</mi><mo stretchy="false">}</mo><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">{</mo><mi>a</mi><mo stretchy="false">}</mo><mo stretchy="false">{</mo><mi>b</mi><mo stretchy="false">}</mo><mo stretchy="false">}</mo><mo>=</mo><mo stretchy="false">(</mo><msup><mi>a</mi><mo>∗</mo></msup><msup><mi>b</mi><mo>∗</mo></msup><msup><mo stretchy="false">)</mo><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">b\{ab\}=\{ba\}b\\\{a|b\}=\{\{a\}\{b\}\}=(a^*b^*)^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mopen">{</span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">b</span><span class="mord mathdefault">a</span><span class="mclose">}</span><span class="mord mathdefault">b</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">a</span><span class="mord">∣</span><span class="mord mathdefault">b</span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mopen">{</span><span class="mord mathdefault">a</span><span class="mclose">}</span><span class="mopen">{</span><span class="mord mathdefault">b</span><span class="mclose">}</span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span></span></p><p>性质：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261027294.png" alt="image-20241126102736239" /></p><h3 id="正则3-型文法转换为正则表达式"><a class="markdownIt-Anchor" href="#正则3-型文法转换为正则表达式"></a> 正则（3 型）文法转换为正则表达式</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412081111573.png" alt="image-20241208111043921" /></p><ul><li>代入：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>x</mi><mi>B</mi><mo separator="true">,</mo><mi>B</mi><mo>→</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow xB,B\rightarrow y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，转换为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>x</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow xy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li><li>消除递归：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>x</mi><mi>A</mi><mi mathvariant="normal">∣</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow xA|y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault">A</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，转换为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><msup><mi>x</mi><mo>∗</mo></msup><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow x^*y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8831359999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li><li>BNF：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>x</mi><mo separator="true">,</mo><mi>A</mi><mo>→</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow x,A\rightarrow y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，转换为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">A\rightarrow x|y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li></ul><h2 id="有穷自动机"><a class="markdownIt-Anchor" href="#有穷自动机"></a> 有穷自动机</h2><h3 id="类别"><a class="markdownIt-Anchor" href="#类别"></a> 类别</h3><h4 id="确定的有穷自动机-dfa"><a class="markdownIt-Anchor" href="#确定的有穷自动机-dfa"></a> 确定的有穷自动机 DFA</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261038476.png" alt="image-20241126103847422" /></p><h4 id="不确定的有穷自动机-nfa"><a class="markdownIt-Anchor" href="#不确定的有穷自动机-nfa"></a> 不确定的有穷自动机 NFA</h4><p>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\delta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03785em;">δ</span></span></span></span>为多值函数，且输入允许为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，那么自动机就是不确定的，某一个状态，对于输入某个字符存在多个后继状态。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412081133285.png" alt="image-20241208113349218" /></p><h3 id="nfa-的确定化"><a class="markdownIt-Anchor" href="#nfa-的确定化"></a> NFA 的确定化</h3><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi><mo>−</mo><mi>C</mi><mi>l</mi><mi>o</mi><mi>s</mi><mi>u</mi><mi>r</mi><mi>e</mi><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\varepsilon-Closure(I)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">ε</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</span></span></span></span>：</p><ul><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo>∈</mo><mi>I</mi></mrow><annotation encoding="application/x-tex">s\in I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo>∈</mo><mi>ε</mi><mo>−</mo><mi>C</mi><mi>l</mi><mi>o</mi><mi>s</mi><mi>u</mi><mi>r</mi><mi>e</mi><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s\in \varepsilon-Closure(I)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">ε</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</span></span></span></span></li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo>∈</mo><mi>I</mi></mrow><annotation encoding="application/x-tex">s\in I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span></span></span></span>，则从<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>出发经过任意条<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>弧能到达的状态都属于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi><mo>−</mo><mi>C</mi><mi>l</mi><mi>o</mi><mi>s</mi><mi>u</mi><mi>r</mi><mi>e</mi><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\varepsilon-Closure(I)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">ε</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</span></span></span></span>。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261102837.png" alt="image-20241126110255798" /></p><p>由 start：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mo>=</mo><mi>ε</mi><mo>−</mo><mi>C</mi><mi>l</mi><mi>o</mi><mi>s</mi><mi>u</mi><mi>r</mi><mi>e</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mrow><mn>1</mn><mo separator="true">,</mo><mn>4</mn></mrow></mrow><annotation encoding="application/x-tex">I=\varepsilon-Closure(1)={1,4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">ε</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">4</span></span></span></span></span>确定第一个状态</p><table><thead><tr><th>I</th><th><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>I</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">I_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th><th><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>I</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">I_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th><th><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>I</mi><mi>c</mi></msub></mrow><annotation encoding="application/x-tex">I_c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr></thead><tbody><tr><td>{1,4}</td><td>{2,3}</td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td></tr><tr><td>{2,3}</td><td>{2}</td><td>{4}</td><td>{3,4}</td></tr><tr><td>{2}</td><td>{2}</td><td>{4}</td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td></tr><tr><td>{4}</td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td></tr><tr><td>{3,4}</td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></td><td>{4}</td></tr></tbody></table><p>直至所有状态都分析完毕，给状态重新编号</p><p><strong>包含原来终态的状态就是终态，DFA 可以有多个终态</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261108714.png" alt="image-20241126110830666" /></p><p><mark>对于任何一个 NFA M’，都可以构造出一个 DFA M，使得 L(M)=L(M’)</mark></p><h3 id="dfa-最小化"><a class="markdownIt-Anchor" href="#dfa-最小化"></a> DFA 最小化</h3><p><mark>对于任意一个 DFA，存在一个唯一的状态最少的等价的 DFA</mark></p><p>最简：没有多余状态且他的状态中没有两个是互相等价的，所以需要消除多余状态，合并等价状态</p><p>状态 s 和 t 等价条件是：</p><ul><li>一致性条件：s 和 t 同时为可接受状态或不接受状态</li><li>蔓延性条件：对于所有输入符号，s 和 t 必须转换到等价的状态里<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261503445.png" alt="image-20241126150336399" /></li></ul><p><strong>分割法</strong>：把一个 DFA（不包含多余状态）分割成一些不相关的子集，不同的两个子集状态都是可区别的，同一个子集中的任何状态都是等价的。</p><p><mark>任何有后继的状态和任何无后继的状态一定不等价</mark></p><ol><li>区分终态和非终态</li><li>不同的两个子集状态都区别，同一子集的后继都要落到同一区。</li></ol><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261538604.png" alt="image-20241126153844544" /></p><h3 id="正则表达式和有穷自动机的等价性"><a class="markdownIt-Anchor" href="#正则表达式和有穷自动机的等价性"></a> 正则表达式和有穷自动机的等价性</h3><p><mark>任何一个正则表达式，都可以构造出等价的 DFA，反之同理</mark></p><h4 id="有穷自动机-正则文法"><a class="markdownIt-Anchor" href="#有穷自动机-正则文法"></a> 有穷自动机 → 正则文法</h4><ol><li>对转换函数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">f(A,t)=B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>，写成产生式<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>t</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">A\rightarrow tB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></li><li>对可接受（终态）状态 Z，增加产生式<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Z</mi><mo>→</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">Z\rightarrow \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span></li><li>有穷自动机的出态对应文法的开始符号，有穷自动机的字母表为文法的终结符号集</li></ol><blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261554314.png" alt="image-20241126155414263" /></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mo>=</mo><mo stretchy="false">(</mo><mrow><mi>A</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>C</mi><mo separator="true">,</mo><mi>D</mi></mrow><mo separator="true">,</mo><mrow><mi>a</mi><mo separator="true">,</mo><mi>b</mi></mrow><mo separator="true">,</mo><mi>P</mi><mo separator="true">,</mo><mi>A</mi><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mi>P</mi><mo>:</mo><mi>A</mi><mo>→</mo><mi>a</mi><mi>B</mi><mi mathvariant="normal">∣</mi><mi>b</mi><mi>D</mi><mspace linebreak="newline"></mspace><mi>B</mi><mo>→</mo><mi>b</mi><mi>C</mi><mspace linebreak="newline"></mspace><mi>C</mi><mo>→</mo><mi>a</mi><mi>A</mi><mi mathvariant="normal">∣</mi><mi>b</mi><mi>D</mi><mi mathvariant="normal">∣</mi><mi>ε</mi><mspace linebreak="newline"></mspace><mi>D</mi><mo>→</mo><mi>b</mi><mi>D</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mi>B</mi><mi mathvariant="normal">∣</mi><mi>ε</mi></mrow><annotation encoding="application/x-tex">G=({A,B,C,D},{a,b},P,A)\\P:A\rightarrow aB|bD\\B\rightarrow bC\\C\rightarrow aA|bD|\varepsilon\\D\rightarrow bD|aB|\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">∣</span><span class="mord mathdefault">b</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault">A</span><span class="mord">∣</span><span class="mord mathdefault">b</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord">∣</span><span class="mord mathdefault">ε</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">∣</span><span class="mord mathdefault">ε</span></span></span></span></span></p></blockquote><h4 id="正则文法-有穷自动机"><a class="markdownIt-Anchor" href="#正则文法-有穷自动机"></a> 正则文法 → 有穷自动机</h4><ol><li>字母表与 G 的终结符号相同</li><li>为 G 中的每个非终结符生成 M 的一个状态，G 的开始符号 S 是开始状态 S</li><li>增加新状态 Z 作为 NFA 的终态</li><li>形如<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>t</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">A\rightarrow tB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mo>→</mo><mi mathvariant="normal">终</mi><mi mathvariant="normal">结</mi><mi mathvariant="normal">符</mi><mi mathvariant="normal">∣</mi><mi>ε</mi></mrow><annotation encoding="application/x-tex">t\rightarrow 终结符|\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">终</span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">符</span><span class="mord">∣</span><span class="mord mathdefault">ε</span></span></span></span>，构造<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">f(A,t)=B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></li></ol><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412081148540.png" alt="image-20241208114836486" /></p><h4 id="正则式-有穷自动机"><a class="markdownIt-Anchor" href="#正则式-有穷自动机"></a> 正则式 → 有穷自动机</h4><p>【PPT P11】</p><h4 id="有穷自动机-正则式"><a class="markdownIt-Anchor" href="#有穷自动机-正则式"></a> 有穷自动机 → 正则式</h4><ol><li><p>在自动机上增加两个结点 x，y，从 x 结点用<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>弧到 M 所有初态，从所有终态用<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>到 y 结点</p></li><li><p>逐步消去所有结点</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411261601922.png" alt="image-20241126160117870" /></p></li></ol><h4 id="正则文法-正则式"><a class="markdownIt-Anchor" href="#正则文法-正则式"></a> 正则文法 → 正则式</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412081149365.png" alt="image-20241208114949304" /></p><h4 id="正则式-正则文法"><a class="markdownIt-Anchor" href="#正则式-正则文法"></a> 正则式 → 正则文法</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412081150497.png" alt="image-20241208115032420" /></p><h2 id="词法分析程序的自动生成器"><a class="markdownIt-Anchor" href="#词法分析程序的自动生成器"></a> 词法分析程序的自动生成器</h2><blockquote><p>根据给定的正则表达式自动生成相应的词法分析程序</p></blockquote><ul><li>辅助定义式</li><li>识别规则</li><li>用户子程序</li></ul><h1 id="12-语法分析"><a class="markdownIt-Anchor" href="#12-语法分析"></a> 12 语法分析</h1><blockquote><p>自顶向下主要方法：递归子程序法，LL 分析法</p><p>自底向上主要方法：算符优先分析法，LR 分析法</p></blockquote><h2 id="ll-分析法"><a class="markdownIt-Anchor" href="#ll-分析法"></a> LL 分析法</h2><blockquote><p>LL-自左向右扫描、自左向右地分析和匹配输入传，表现为最左推导的性质</p></blockquote><h3 id="组成部分"><a class="markdownIt-Anchor" href="#组成部分"></a> 组成部分</h3><p><mark>将语法成分的左右界符用#表示</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101311693.png" alt="image-20241210131117592" /></p><h4 id="分析表"><a class="markdownIt-Anchor" href="#分析表"></a> 分析表</h4><p>是二维矩阵</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101313714.png" alt="image-20241210131348659" /></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo stretchy="false">[</mo><mi>A</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">]</mo><mo>=</mo><mi>A</mi><mo>:</mo><mo>:</mo><mo>=</mo><msub><mi>a</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">M[A,a]=A::=a_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mopen">[</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>表示 A 去匹配输入串时，且输入符号为 a 时，可以用 A 的第 i 个选择匹配</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo stretchy="false">[</mo><mi>A</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">]</mo><mo>=</mo><mi>e</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">M[A,a]=error</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mopen">[</span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span></span></span></p><p>表示不能匹配。</p><h4 id="符号栈"><a class="markdownIt-Anchor" href="#符号栈"></a> 符号栈</h4><ul><li>开始状态：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101405928.png" alt="image-20241210140552872" /></li><li>工作状态：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101406718.png" alt="image-20241210140618656" /></li><li>出错状态：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101406670.png" alt="image-20241210140638616" /></li><li>结束状态： <img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412101406794.png" alt="image-20241210140644739" /></li></ul><h4 id="执行程序"><a class="markdownIt-Anchor" href="#执行程序"></a> 执行程序</h4><ol><li>把#和文法识别符号 E 推进栈，读入下一个符号，重复下述过程直到正常结束或出错</li><li>测定栈顶符号 X 和当前输入符号 a<ol><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>=</mo><mi>a</mi><mo>=</mo><mi mathvariant="normal">#</mi></mrow><annotation encoding="application/x-tex">X=a=\#</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">#</span></span></span></span>，正常结束</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>=</mo><mi>a</mi><mi mathvariant="normal">≠</mi><mi mathvariant="normal">#</mi></mrow><annotation encoding="application/x-tex">X=a\neq \#</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">#</span></span></span></span>，把 X 推出栈，读入下一个符号</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">X\in V_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，查分析表<ol><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo stretchy="false">[</mo><mi>X</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">]</mo><mo>=</mo><mi>X</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>U</mi><mi>V</mi><mi>W</mi></mrow><annotation encoding="application/x-tex">M[X,a]=X::=UVW</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span></span></span></span>，将 X 弹出栈，UVW 入栈（U 在栈顶：最左推导）</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo stretchy="false">[</mo><mi>X</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">]</mo><mo>=</mo><mi>e</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">M[X,a]=error</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span></span>，出错处理</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo stretchy="false">[</mo><mi>X</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">]</mo><mo>=</mo><mi>X</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">M[X,a]=X::=\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，a 为 X 的后继符号，将 X 弹出栈（不读下一符号），继续分析</li></ol></li></ol></li></ol><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111620321.png" alt="image-20241211161945074" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111622765.png" alt="image-20241211162212691" /></p><h3 id="构造分析表"><a class="markdownIt-Anchor" href="#构造分析表"></a> 构造分析表</h3><p>求 first 集和 follow 集，follow 即求非终结符右边所有终结符的集合（开始符号的 follow 集有#，follow 集不包含 ε）</p><p>follow 集合的定义：</p><ul><li>若 A 是开始符号，则#就在 Follow (A) 中。</li><li>若存在产生式 B →aAg ，则 First (g) - {ε }在 Follow (A) 中。</li><li>若存在产生式 B →aA 或 B →aAg ，且 ε 在 First (g) 中，则 Follow (A)包括 Follow (B)。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111653360.png" alt="image-20241211165301285" /></p><p>将 first 集填入，如果可以推出 ε，就将 follow 所在的全部填入</p><p><strong>不是所有的文法都能构造出上述的分析表，能使用的称为 LL(1)文法</strong></p><h3 id="ll1文法"><a class="markdownIt-Anchor" href="#ll1文法"></a> LL(1)文法</h3><blockquote><p>其分析表 M 不含多重定义入口（即分析表中无两条以上规则）</p></blockquote><p>是 LL(1)文法的充要条件，即证明是 LL(1)文法：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111655344.png" alt="image-20241211165530286" /></p><p><mark>如果 G 是左递归的,或者是二义性的文法,则至少有一 个多重入口</mark></p><p>TODO：有些文法可以从非 LL(1)改写为 LL(1)</p><h2 id="移进-归约分析"><a class="markdownIt-Anchor" href="#移进-归约分析"></a> 移进-归约分析</h2><blockquote><p>记录分析的历史和现状，确定下一步动作是移进还是归约</p></blockquote><ul><li>按扫描顺序一一移进符号栈</li><li>移进过程中检查栈中符号，若当前栈顶的若干符号形成当前句型的句柄时，就根据规则进行归约<ul><li>将句柄从符号栈弹出，将非终结符号压入栈</li><li>检查栈内符号串是否构成新的句柄，若有就再次归约</li></ul></li><li>分析一直读到右界符</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111717135.png" alt="image-20241211171744046" /></p><blockquote><p>但是 b 也可以直接归约为 A，为什么将 Ab 归约为 A 呢？</p></blockquote><p><mark>未真正解决句柄的识别</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111720938.png" alt="image-20241211172005882" /></p><h2 id="算符优先分析"><a class="markdownIt-Anchor" href="#算符优先分析"></a> 算符优先分析</h2><blockquote><p>预先规定相邻终结符之间的优先关系，从而确定句柄进行归约。</p></blockquote><p>当栈顶项(或次栈顶项)<mark>终结符（除去非终结符）<mark>的优先级大于栈外的</mark>终结符</mark>的优先级，则进行归约，否则移进。（竖列是栈内，横列是栈外）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111731384.png" alt="image-20241211173155305" /></p><h3 id="算符优先文法-opg"><a class="markdownIt-Anchor" href="#算符优先文法-opg"></a> 算符优先文法 OPG</h3><p>OG 文法：无形如<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>=</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi>V</mi><mi>W</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">U=...VW...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span></span></span></span>的规则，这里<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>V</mi><mo separator="true">,</mo><mi>W</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">V,W\in V_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><ul><li>运算是以中缀形式出现的</li><li>如果是 OG 文法，就不会出现两个非终结符相邻的句型</li><li>算法语言中的表达式以及大部分语言成分的文法均是 OG 文法</li></ul><h3 id="构造优先关系矩阵"><a class="markdownIt-Anchor" href="#构造优先关系矩阵"></a> 构造优先关系矩阵</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111752568.png" alt="image-20241211175247511" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111752741.png" alt="image-20241211175257684" /></p><p>构造 FIRSTVT(U)：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111755198.png" alt="image-20241211175502132" /></p><p>构造 LASTVT(U)：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111755291.png" alt="image-20241211175523229" /></p><p>素短语：文法 G 的句型的素短语是一个短语，他至少包含一个终结符号，并且除他自身以外不再包含其他素短语</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111757220.png" alt="image-20241211175746145" /></p><p>是找句型的最左子串（最左素短语）并进行归约。</p><h2 id="lr-分析法"><a class="markdownIt-Anchor" href="#lr-分析法"></a> LR 分析法</h2><p>从左到右扫描(L)自底向上进行归约®，是规范归约</p><h3 id="组成部分-2"><a class="markdownIt-Anchor" href="#组成部分-2"></a> 组成部分</h3><ul><li>状态栈：放置分析器状态和文法符号</li><li>分析表：两个矩阵，指示分析器的动作，是移进还是归约，根据不同的文法类采用不同的构造方法</li><li>控制程序：根据分析表所规定的动作，对栈操作</li></ul><h3 id="分析表种类"><a class="markdownIt-Anchor" href="#分析表种类"></a> 分析表种类</h3><ul><li>SLR 分析表（简单 LR 分析表）：构造简单，大多数上下文无关文法都能构造出</li><li>LR 分析表（规范 LR 分析表）：适用文法类最大，几乎所有上下文无关文法都能构造出，但分析表体积太大</li><li>LALR 分析表（超前 LR 分析表）：适用文法类和实现难易在两者之间，但很实用</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111810333.png" alt="image-20241211181032269" /></p><p>状态转移表(GOTO)，分析动作表(ACTION)</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111822612.png" alt="image-20241211182256560" /></p><h3 id="构造-lr0"><a class="markdownIt-Anchor" href="#构造-lr0"></a> 构造 LR(0)</h3><ul><li>将文法拓广：使其只有一个接受状态，消除所有|，列出文法所有的项目</li><li>将有关项目组成项目集,所有项目集构成的集合即为 LR(0)</li></ul><h1 id="14-代码优化"><a class="markdownIt-Anchor" href="#14-代码优化"></a> 14 代码优化</h1><h2 id="概述-3"><a class="markdownIt-Anchor" href="#概述-3"></a> 概述</h2><p>分类 1：</p><ul><li>与机器无关：在中间代码的优化，包括数据流分析、常量传播、公共子表达式删除、死代码删除等等</li><li>与机器相关：充分利用系统资源，包括指令系统、寄存器资源。<mark>只在特定体系结构下有效</mark></li></ul><p>分类 2：</p><ul><li>局部优化：基本块内，eg：局部公共子表达式删除</li><li>全局优化：函数/过程内，跨越基本块，eg：全局数据流分析</li><li>跨函数优化：整个程序，eg：跨函数别名分析，逃逸分析</li></ul><h2 id="基本块和流图"><a class="markdownIt-Anchor" href="#基本块和流图"></a> 基本块和流图</h2><h3 id="基本块"><a class="markdownIt-Anchor" href="#基本块"></a> 基本块</h3><p>基本块，满足以下条件的最大序列：<mark>没有跳转，没有分支的最大序列</mark></p><ul><li>连续的语句序列</li><li>程序的执行只能从第一条进入</li><li>只能从最后一句离开</li></ul><blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411021151793.png" alt="image-20241102115150685" /></p><p>（1）-（6）：goto 可能直接跳到（3），所以不是</p><p>（3）-（8）：×，不是最大的</p><p>（7）-（13）：×</p></blockquote><h4 id="划分基本块"><a class="markdownIt-Anchor" href="#划分基本块"></a> 划分基本块</h4><p>输入：四元式序列</p><p>输出：基本块列表，每个四元式仅出现在一个基本块中</p><p>方法：</p><ul><li>确定入口语句（每个基本块的第一条语句）集合<ul><li>整个序列的第一条语句</li><li>任何能由条件/无条件跳转转移到的第一条语句</li><li>紧跟在跳转语句之后的第一条语句</li></ul></li><li>每个入口语句直到下一个入口语句或者程序结束，属于同一个基本块</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051436897.png" alt="image-20241205143321541" /></p><h3 id="流图"><a class="markdownIt-Anchor" href="#流图"></a> 流图</h3><p>是有向图，节点为基本块，如果在某执行序列中，B2 紧跟在 B1 之后，则 B1 到 B2 有一条有向边。</p><h4 id="循环的查找"><a class="markdownIt-Anchor" href="#循环的查找"></a> 循环的查找</h4><p><mark>循环体中的优化效果更好</mark></p><p>如果从首节点出发，任何到达节点 B 的路径上都要经过 A，那么 A 就是 B 的必经节点，记为<code>A dom B</code>。</p><p>如果有边<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">B\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mtext> </mtext><mi>d</mi><mi>o</mi><mi>m</mi><mtext> </mtext><mi>B</mi></mrow><annotation encoding="application/x-tex">A\ dom\ B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace"> </span><span class="mord mathdefault">d</span><span class="mord mathdefault">o</span><span class="mord mathdefault">m</span><span class="mspace"> </span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>，该边即为循环的回边</p><p>循环体：能到达 B 且不经过 A</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051439561.png" alt="image-20241205143948491" /></p><h2 id="局部优化"><a class="markdownIt-Anchor" href="#局部优化"></a> 局部优化</h2><blockquote><p>也就是基本块内的优化</p></blockquote><h3 id="利用代数性质"><a class="markdownIt-Anchor" href="#利用代数性质"></a> 利用代数性质</h3><ul><li><p>编译时完成常量表达式的计算，整数类型与实型的转换</p></li><li><p>下标变量引用时，地址计算的一部分工作在编译时预先做好（运行时只计算可变部分）</p></li><li><p>运算强度削弱<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411021312039.png" alt="image-20241102131243970" /></p></li><li><p>常数合并和传播<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411021313896.png" alt="image-20241102131313823" /></p></li><li><p>删除冗余代码：判断语句永远为 true，那 else 部分则为死代码</p></li></ul><h3 id="消除公共子表达式"><a class="markdownIt-Anchor" href="#消除公共子表达式"></a> 消除公共子表达式</h3><h4 id="构建-dag-图算法"><a class="markdownIt-Anchor" href="#构建-dag-图算法"></a> 构建 DAG 图算法</h4><p>输入：基本块内的中间代码序列</p><p>输出：完成局部公共子表达式删除后的 DAG 图</p><p>方法：</p><ul><li>建立节点表，记录了变量名和常量值，以及他们当前多对应的 DAG 图中的节点的序号。该表初始状态为空</li><li>对于形如<code>z=x op y</code>的中间代码，首先在节点表寻找 x，如果找到则记录下对应节点号 i；反之新建叶节点，假设其节点号仍为 i，标记为 x（如 x 为变量名，该标记更改为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">x_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>）；在节点表中增加新的一项（x，i），表明二者关系。y 与 x 同理。</li><li>在 DAG 寻找中间节点，标记为 op，左操作数节点号为 i，右操作数节点号为 j。如果找到记录下其节点号 k；如果未找到，在 DAG 图中新建一个中间节点，假设其节点号仍为 k，并将节点 i 和 j 分别与 k 相连，作为其左子节点和右子节点</li><li>在节点表中寻找 z，如果找到，将 z 所对应的节点号更改为 k；如果未找到，在节点表中新建一项(z, k)，表明二者之间的对应关系</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411022113992.png" alt="image-20241102211311907" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051530555.png" alt="image-20241205153032489" /></p><p><strong>数组、指针及函数调用的 DAG 图</strong></p><blockquote><ul><li>数组：将<code>x=a[i]</code>处理为[]为数组取值操作符；将<code>a[j]=y</code>处理为[]=为数组成员赋值操作符</li><li>指针：保守处理</li><li>函数调用：保守的认为函数调用改变了他所有可能改变的数据</li></ul></blockquote><h4 id="从-dag-图导出代码的算法"><a class="markdownIt-Anchor" href="#从-dag-图导出代码的算法"></a> 从 DAG 图导出代码的算法</h4><p>输入：DAG 图</p><p>输出：中间代码序列</p><p>方法：</p><ol><li>初始化一个放置 DAG 图中间节点的队列</li><li>如果 DAG 图中还有<mark>中间节点</mark>未进入队列，则执行步骤 3，否则执行步骤 5</li><li>选取一个尚未进入队列，但其所有父节点均已进入队列的中间节点 n 将其加入队列；或选取没有父节点的中间节点，将其加入队列</li><li>如果 n 的最左子节点符合步骤 3 的条件，将其加入队列；并沿着当前节点的最左边，循环访问其最左子节点，最左子节点的最左子节点等，将符合步骤 3 条件的中间节点依次加入队列；如果出现不符合步骤 3 条件的最左子节点，执行步骤 2</li><li>将中间节点队列逆序输出，便得到中间节点的计算顺序，将其整理成中间代码序列</li></ol><p><strong>叶节点不属于节点，不占用最左的范围。eg：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>t</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">t_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的最左子节点为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>t</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">t_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051554209.png" alt="image-20241205155459140" /></p><blockquote><p>窥孔优化：关注在一个目标指令的一个较短的序列上，删除冗余代码。<mark>不一定局限在同一基本块</mark></p></blockquote><h2 id="全局优化"><a class="markdownIt-Anchor" href="#全局优化"></a> 全局优化</h2><blockquote><p>是跨基本块的优化，受到控制流的影响（分支、循环）。</p><p>消除死代码，变量的活性</p></blockquote><h3 id="数据流分析"><a class="markdownIt-Anchor" href="#数据流分析"></a> 数据流分析</h3><p>用于获取数据在程序执行路径只如何流动</p><ul><li>变量语句前后是否存活。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mrow><mi>o</mi><mi>u</mi><mi>t</mi></mrow></msub><mo>=</mo><msub><mi>f</mi><mrow><mi mathvariant="normal">语</mi><mi mathvariant="normal">句</mi></mrow></msub><mo stretchy="false">(</mo><msub><mi>V</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V_{out}=f_{语句}(V_{in})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">o</span><span class="mord mathdefault mtight">u</span><span class="mord mathdefault mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:-0.15em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord cjk_fallback mtight">语</span><span class="mord cjk_fallback mtight">句</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li><li>变量何时定义</li><li>变量某一执行点上被定义的值，可能哪些执行点使用</li></ul><p>考察在程序的某个执行点的数据流信息：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>S</mi><mo stretchy="false">]</mo><mo>=</mo><mi>g</mi><mi>e</mi><mi>n</mi><mo stretchy="false">[</mo><mi>S</mi><mo stretchy="false">]</mo><mo>∪</mo><mo stretchy="false">(</mo><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>S</mi><mo stretchy="false">]</mo><mo>−</mo><mi>k</mi><mi>i</mi><mi>l</mi><mi>l</mi><mo stretchy="false">[</mo><mi>S</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">out[S]=gen[S]\cup(in[S]-kill[S])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">]</span><span class="mclose">)</span></span></span></span></span></p><ul><li><code>S</code>：某条语句|基本块|语句集合|基本块集合</li><li><code>out[S]</code>：S 末尾得到的数据流信息</li><li><code>gen[S]</code>：S 本身产生的数据流信息</li><li><code>in[S]</code>：进入 S 时的数据流信息</li><li><code>kill[S]</code>：S 注销的数据流信息，<strong>也就是覆盖了之前的赋值！</strong></li></ul><p>数据流方程求解过程的关键因素：</p><ul><li>产生和注销的信息取决于具体问题，可以由 in 定义 out，也可以由 out 定义 in</li><li>数据是沿着程序的执行路径，所以分析结果收到控制程序==结构的影响</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051713039.png" alt="image-20241205171316982" /></p><h4 id="到达定义分析"><a class="markdownIt-Anchor" href="#到达定义分析"></a> 到达定义分析</h4><p>Q：如果 p 处对该变量的引用，取得的值是否在 d 处定义？</p><p>A：如果从定义点 d 出发，存在一条路径达到 p，并且在该路径上，不存在对该变量的其他定义语句，则认为“变量的定义点 d 到达静态点 p”</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411022153393.png" alt="image-20241102215321314" /></p><p><strong>可能存在循环</strong></p><p><code>kill[d1]</code>：程序中对 u 定义的其他定义点的集合，<mark>包括 d1 之前或之后的定义点</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051641746.png" alt="image-20241205164144668" /></p><p>（<code>cmp</code>是比较）</p><p><strong>对于基本块的 gen 和 out 计算：</strong></p><p>内部还需要减去之前 kill 的</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051644806.png" alt="image-20241205164441734" /></p><hr /><p>输入：程序流图，且基本块的 kill 集合【gen 修改了哪些变量】和 gen 集合已经计算完成</p><p>输出：每个基本块入口和出口处<code>in[B]</code>和<code>out[B]</code></p><p>方法：</p><ul><li><p>将包括代表流图出口基本块<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>B</mi><mrow><mi>e</mi><mi>x</mi><mi>i</mi><mi>t</mi></mrow></msub></mrow><annotation encoding="application/x-tex">B_{exit}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="mord mathdefault mtight">x</span><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的所有基本块的 out 集合初始化为空集</p></li><li><p>根据方程为基本块 B 以此计算 in 和 out</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><msub><mo>∪</mo><mrow><mi>B</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">前</mi><mi mathvariant="normal">驱</mi><mi mathvariant="normal">基</mi><mi mathvariant="normal">本</mi><mi mathvariant="normal">块</mi><mi>P</mi></mrow></msub><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>P</mi><mo stretchy="false">]</mo><mspace linebreak="newline"></mspace><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><mi>g</mi><mi>e</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>∪</mo><mo stretchy="false">(</mo><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>−</mo><mi>k</mi><mi>i</mi><mi>l</mi><mi>l</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">in[B]=\cup_{B的前驱基本块P}out[P]\\out[B]=gen[B]\cup(in[B]-kill[B])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mbin">∪</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback mtight">的</span><span class="mord cjk_fallback mtight">前</span><span class="mord cjk_fallback mtight">驱</span><span class="mord cjk_fallback mtight">基</span><span class="mord cjk_fallback mtight">本</span><span class="mord cjk_fallback mtight">块</span><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mclose">]</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mclose">)</span></span></span></span></span></p></li><li><p>如果 out 与之前不一致，则重复计算直到不再变化</p></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051651130.png" alt="image-20241205165151047" /></p><blockquote><p>更快的运算：位运算</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051653778.png" alt="image-20241205165338707" /></p></blockquote><h4 id="活跃变量分析"><a class="markdownIt-Anchor" href="#活跃变量分析"></a> 活跃变量分析</h4><p><mark>反向分析</mark></p><p>变量 x 的值在 p 点或沿着从 p 出发的某条路经中会被使用，则称 x 在 p 点是活跃的。</p><p><mark>对于寄存器分配有重要意义</mark></p><ul><li>不再活跃释放寄存器</li><li>活跃范围不重合，可共享寄存器</li></ul><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><mi>u</mi><mi>s</mi><mi>e</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>∪</mo><mo stretchy="false">(</mo><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>−</mo><mi>d</mi><mi>e</mi><mi>f</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><msub><mo>∪</mo><mrow><mi>B</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">后</mi><mi mathvariant="normal">继</mi><mi mathvariant="normal">基</mi><mi mathvariant="normal">本</mi><mi mathvariant="normal">块</mi><mi>P</mi></mrow></msub><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>P</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">in[B]=use[B]\cup(out[B]-def[B])\\out[B]=\cup_{B的后继基本块P}in[P]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">u</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">d</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mbin">∪</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback mtight">的</span><span class="mord cjk_fallback mtight">后</span><span class="mord cjk_fallback mtight">继</span><span class="mord cjk_fallback mtight">基</span><span class="mord cjk_fallback mtight">本</span><span class="mord cjk_fallback mtight">块</span><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mclose">]</span></span></span></span></span></p><ul><li><code>def[B]</code>：被定义先于对于他们的使用（定义了）</li><li><code>use[B]</code>：被使用先于对他们的定义（用了）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411022214744.png" alt="image-20241102221443682" /></p><p>例子：倒着往前算</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051726192.png" alt="image-20241205172632124" /></p><h5 id="死代码消除"><a class="markdownIt-Anchor" href="#死代码消除"></a> 死代码消除</h5><p>哪些赋值后面没有用到</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051729319.png" alt="image-20241205172959240" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051731303.png" alt="image-20241205173118237" /></p><h3 id="全局复制传播"><a class="markdownIt-Anchor" href="#全局复制传播"></a> 全局复制传播</h3><blockquote><p>寻找所有可以被替换成常量的变量</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060842278.png" alt="image-20241206084217145" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060843947.png" alt="image-20241206084323877" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060844358.png" alt="image-20241206084405290" /></p><h3 id="定义-使用链"><a class="markdownIt-Anchor" href="#定义-使用链"></a> 定义-使用链</h3><h4 id="冲突图"><a class="markdownIt-Anchor" href="#冲突图"></a> 冲突图</h4><blockquote><p>假设只有跨越基本块活跃的变量才能分配到全局寄存器，并且活跃范围重合的变量之间无法共享全局寄存器</p></blockquote><p>边线连接：一个变量在另一个变量==定义（赋值）==时是活跃的</p><h4 id="定义-使用链-2"><a class="markdownIt-Anchor" href="#定义-使用链-2"></a> 定义-使用链</h4><p>定义-使用链：变量的某一<mark>定义点</mark>，以及所有可能使用该定义点所定义变量值的<mark>使用点</mark>所组成的一个链</p><blockquote><p>链之中，第一个点是定义点，剩下都是使用点。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>&lt;</mo><mi>B</mi><mn>1</mn><mo separator="true">,</mo><mn>1</mn><mo>&gt;</mo></mrow><annotation encoding="application/x-tex">&lt;B1,1&gt;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span></span></span> B1 基本块的第一行被定义 or 使用</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060902156.png" alt="image-20241206090231081" /></p><p>如果他们拥有某个同样的使用点，则合并为同一个网。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060903952.png" alt="image-20241206090327901" /></p><p>画出网络后，如果链之间有连接，说明变量之间有冲突</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060905178.png" alt="image-20241206090501107" /></p><h3 id="循环优化"><a class="markdownIt-Anchor" href="#循环优化"></a> 循环优化</h3><h4 id="循环不变式的代码外提"><a class="markdownIt-Anchor" href="#循环不变式的代码外提"></a> 循环不变式的代码外提</h4><blockquote><p>不随循环控制变量改变而改变的表达式</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060909076.png" alt="image-20241206090911018" /></p><h4 id="循环展开"><a class="markdownIt-Anchor" href="#循环展开"></a> 循环展开</h4><blockquote><p>以空间换时间</p></blockquote><p>判断原则：</p><ul><li>主存资源丰富，处理机时间昂贵</li><li>循环体语句越少越好</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060910316.png" alt="image-20241206091017241" /></p><p>实现步骤：</p><ul><li>识别循环结构，确定循环的初值，终值，步长</li><li>判断，以空间换时间是否合算来决定是否展开</li><li>展开，重复产生循环体所需的代码个数</li></ul><h4 id="归纳变量的优化和条件判断的替换"><a class="markdownIt-Anchor" href="#归纳变量的优化和条件判断的替换"></a> 归纳变量的优化和条件判断的替换</h4><p>归纳变量：循环中固定增加或减少一个常量值</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060922552.png" alt="image-20241206092200468" /></p><h1 id="15-目标代码生成"><a class="markdownIt-Anchor" href="#15-目标代码生成"></a> 15 目标代码生成</h1><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412060923506.png" alt="image-20241206092317450" /></p><p>代码生成器的输入：</p><ul><li>源程序的中间表示<ul><li>线性表示（波兰式）</li><li>三地址码（四元式）</li><li>栈式中间代码（p-code/java bytecode）</li><li>图形表示</li></ul></li><li>符号表信息</li></ul><p>目标程序种类：汇编语言，包含绝对地址的机器语言，可重定位的机器语言</p><p>目标体系结构：微处理器，虚拟机</p><h2 id="现代微处理器体系结构简介"><a class="markdownIt-Anchor" href="#现代微处理器体系结构简介"></a> 现代微处理器体系结构简介</h2><h3 id="指令集架构"><a class="markdownIt-Anchor" href="#指令集架构"></a> 指令集架构</h3><p>栈式指令集架构：在栈顶做运算</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061019072.png" alt="image-20241206101949003" /></p><p>累加器式指令集架构：可以访问内存</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061020288.png" alt="image-20241206102015219" /></p><p>寄存器-内存指令集架构 vs 寄存器-寄存器指令架构</p><p>区别：是否可以直接内存寻址</p><p>共性：内部有多个寄存器可以直接作为 ALU 指令的任一操作数</p><p>优点：减小内存访问，减小指令数</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061022192.png" alt="image-20241206102255110" /></p><h3 id="存储层次架构"><a class="markdownIt-Anchor" href="#存储层次架构"></a> 存储层次架构</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061027276.png" alt="image-20241206102754186" /></p><h2 id="地址空间"><a class="markdownIt-Anchor" href="#地址空间"></a> 地址空间</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061033846.png" alt="image-20241206103318769" /></p><h3 id="程序运行栈"><a class="markdownIt-Anchor" href="#程序运行栈"></a> 程序运行栈</h3><p>子程序/函数运行时所需的基本空间：<strong>活动记录</strong></p><p>地址空间从高地址到低地址向下生长</p><ul><li>ESI：作为源地址指针使用</li><li>EDI：作为目的地址指针使用</li></ul><h2 id="寄存器的分配和指派"><a class="markdownIt-Anchor" href="#寄存器的分配和指派"></a> 寄存器的分配和指派</h2><h3 id="全局寄存器分配"><a class="markdownIt-Anchor" href="#全局寄存器分配"></a> 全局寄存器分配</h3><blockquote><p>全局是相对于基本块而言，分配对象主要是函数的局部变量，包括函数入口参数，有限分配给跨基本块仍然活跃的变量，尤其是循环体内最活跃的变量</p></blockquote><p><mark>专属于线程</mark></p><h4 id="引用计数"><a class="markdownIt-Anchor" href="#引用计数"></a> 引用计数</h4><blockquote><p>统计变量在函数内被引用的次数，根据被引用的特点赋予不同权重，计算唯一权值，根据权值大小分配</p></blockquote><p><mark>循环中的变量应该得到加权</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061047848.png" alt="image-20241206104712750" /></p><p>【PPT P46】</p><h4 id="图着色算法"><a class="markdownIt-Anchor" href="#图着色算法"></a> 图着色算法</h4><p>思想：可供分配 k 个全局寄存器，用 k 种颜色给冲突图着色。</p><p>步骤：</p><ul><li>通过活跃变量分析，构建变量的冲突图</li><li>尝试用 k 种颜色给该冲突图着色</li><li>不够用，考虑权重问题</li></ul><h4 id="启发式图着色"><a class="markdownIt-Anchor" href="#启发式图着色"></a> 启发式图着色</h4><p>设寄存器数目为 k。</p><p>步骤：</p><ul><li>找到第一个连接边数目小于 k 的节点从图中移走</li><li>重复步骤 1，直到无法从图中移走</li><li>在图中选取适当（权重等算法）的节点， 将它记录为“不分配全局寄存器”的节点，从图中移走</li><li>重复，直到图中仅剩余一个节点</li><li>按照节点移走的顺序将点和边添加回去并分配颜色</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412061127434.png" alt="image-20241206112718362" /></p><h3 id="临时寄存器分配"><a class="markdownIt-Anchor" href="#临时寄存器分配"></a> 临时寄存器分配</h3><blockquote><p>Q：为什么管理临时寄存器？</p><p>A：生成某些指令时，必须使用指令寄存器。临时寄存器保存有此前的计算中间结果。</p></blockquote><h4 id="临时寄存器池"><a class="markdownIt-Anchor" href="#临时寄存器池"></a> 临时寄存器池</h4><p>进入基本块，清空临时寄存器池</p><p>申请处理：</p><ul><li>有空闲：分配申请，做表示</li><li>没有：选取一个在即将生成代码中不会被使用的寄存器写回相应的内存空间</li></ul><p>退出基本块：将寄存器池中的值写回内存，清空临时寄存器池</p><h1 id="final"><a class="markdownIt-Anchor" href="#final"></a> final</h1><h2 id="填空"><a class="markdownIt-Anchor" href="#填空"></a> 填空</h2><p><mark>规范归约：减掉当前句型的句柄</mark></p><p>**句型（可以有非终结符）**的短语、简单短语、句柄、素短语：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412162106587.png" alt="image-20241216210623506" /></p><p>乔姆斯基文法的定义和分类：</p><ul><li><p>0 型：短语结构文法，左部右部均可以是符号串，一个短语可以产生另一个短语，可被图灵机接受</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>u</mi><mo>→</mo><mi>v</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>+</mo></msup><mo separator="true">,</mo><mi>V</mi><mo>=</mo><msub><mi>V</mi><mi>n</mi></msub><mo>∪</mo><msub><mi>V</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">P:u\rightarrow v,其中u\in V^+,V=V_n\cup V_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.015771em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.821331em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>1 型：上下文有关，只有在 x，y 的情况下才可以改写，由线性界限自动机，1 型语言 L1</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>x</mi><mi>U</mi><mi>y</mi><mo>→</mo><mi>x</mi><mi>u</mi><mi>y</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>U</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">P:xUy\rightarrow xuy,其中U\in V_n,x,y,u\in V^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>2 型：上下文无关文法，1 型文法<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo separator="true">,</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x,y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，由下推自动机接受</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>:</mo><mi>U</mi><mo>→</mo><mi>u</mi><mo separator="true">,</mo><mi mathvariant="normal">其</mi><mi mathvariant="normal">中</mi><mi>U</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub><mo separator="true">,</mo><mi>u</mi><mo>∈</mo><msup><mi>V</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">P:U\rightarrow u,其中U\in V_n,u\in V^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord cjk_fallback">其</span><span class="mord cjk_fallback">中</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">u</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>3 型：由有穷自动机接受，<strong>正则文法</strong></p><p>左线性：非终结符在最左，右线性：非终结符在最右</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291703041.png" alt="image-20241129170313345" /></p></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411291704436.png" alt="image-20241129170345770" /></p><p>翻译文法：</p><p>是上下文无关文法，终结符号集由输入符号和动作符号组成，由翻译文法产生的终结符号串称为活动序列（终结符，动作符号）</p><p><strong>活动序列=输入序列+动作序列（对偶集）</strong></p><p>NFA：δ 是多值函数，输入允许为 ε，允许在某个状态下，输入字符存在多个后继状态</p><h2 id="大题"><a class="markdownIt-Anchor" href="#大题"></a> 大题</h2><h3 id="正则表达式"><a class="markdownIt-Anchor" href="#正则表达式"></a> 正则表达式</h3><p><strong><font color='orange'>NFA 确定化：</font></strong></p><ul><li>画出 NFA，可以先化简一些<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，比如多个<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>连续，先去除若干状态</li><li>状态：从初始开始，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>能到达的地方的集合作为第一个状态，<mark>包含最终态的状态均为终态</mark></li><li>画出 NFA，<mark>记得化终态</mark></li></ul><p><strong><font color='orange'>DFA 最小化：</font></strong></p><ul><li>将上面的状态-输入表整理</li><li><strong>首先区分终态和非终态</strong></li><li>下一状态均指向相同子集的作为同一状态，<strong>可以 3,5（割开的）作为相同子集</strong></li><li>化 DFA，最终通过正则表达式验证一下是否合理</li></ul><p><strong><font color='orange'>相互转化：</font></strong></p><p>正则表达式：扩充 BNF</p><p>正则文法：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171438469.png" alt="image-20241217143801406" style="zoom:33%;" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171438961.png" alt="image-20241217143851889" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171437394.png" alt="image-20241217143450947" /></p><h3 id="算符优先文法"><a class="markdownIt-Anchor" href="#算符优先文法"></a> 算符优先文法</h3><p>不一定是严格的最左归约</p><p><strong><font color='orange'>算符优先文法定义：</font></strong></p><p>若文法中无形如<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mo separator="true">⋅</mo><mi>V</mi><mi>W</mi><mo separator="true">⋅</mo></mrow><annotation encoding="application/x-tex">U::=·VW·</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mpunct">⋅</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mpunct">⋅</span></span></span></span>规则，这里<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>V</mi><mo separator="true">,</mo><mi>W</mi><mo>∈</mo><msub><mi>V</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">V,W\in V_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则为算符文法。如果在其中任意两个终结符之间，至多只有上述关系的一种，则为算符优先文法</p><p><strong>如果是算符优先文法，肯定在优先矩阵中最多只有一个关系</strong></p><p><mark>可以分析二义性文法，句柄不唯一</mark></p><p>每次归约的是最左素短语：至少包含一个终结符，且不包含除自身之外的素短语</p><p><strong><font color='orange'>求 FIRSTVT 和 LASTVT：</font></strong></p><p>构造 FIRSTVT(U)：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111755198.png" alt="image-20241211175502132" /></p><p>构造 LASTVT(U)：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111755291.png" alt="image-20241211175523229" /></p><p>简单而言就是：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>→</mo><mi>b</mi><mo separator="true">,</mo><mi>U</mi><mo>→</mo><mi>V</mi><mi>a</mi></mrow><annotation encoding="application/x-tex">U\rightarrow b,U\rightarrow Va</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault">a</span></span></span></span></span></p><p>则，</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mi>V</mi><mi>T</mi><mo stretchy="false">(</mo><mi>U</mi><mo stretchy="false">)</mo><mo>=</mo><mi>b</mi><mo>+</mo><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mi>V</mi><mi>T</mi><mo stretchy="false">(</mo><mi>V</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FIRSTVT(U)={b}+FIRSTVT(V)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault">b</span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mclose">)</span></span></span></span></span></p><p><strong><font color='orange'>构造优先关系矩阵：</font></strong></p><p>a 是栈内，b 是栈外：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111752568.png" alt="image-20241211175247511" /></p><p>a 是栈内，FIRSTVT(U)是栈外：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412151717929.png" alt="image-20241215171756872" /></p><p>LASTVT(U)是栈内，b 是栈外：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412151718357.png" alt="image-20241215171749164" /></p><p><mark>关于#（开始符号和结束符号）</mark>：它是终结符，首先记住无论它在哪里，肯定是它最小</p><p>栈内#：代表开始符号，小于最开始的终结符和 FIRSTVT(E)（任意在最开始的非终结符）</p><p>栈外#：代表结束符号，小于最末尾的终结符和 LASTVT(E)（任意在最末尾的非终结符）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412151731061.png" alt="image-20241215173146994" /></p><p><strong><font color='orange'>归约符号串：</font></strong></p><p>小于移进，大于归约</p><p>到最后的时候是比较符号栈中最上面的终结符（可能最顶是非终结符）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171539893.png" alt="image-20241217153816278" /></p><h3 id="符号表和运行栈"><a class="markdownIt-Anchor" href="#符号表和运行栈"></a> 符号表和运行栈</h3><p><strong><font color='orange'>栈式符号表：</font></strong></p><p>当不用的函数等出作用域时，就不用在写在符号表里了</p><ul><li>层次：<strong>看题目从几开始，画出大括号，多个函数并列就是在同一层次</strong></li><li>名字：Ident</li><li>种类：简单变量 var、函数 program、过程 procedure、数组 array、标号 real、参数 param</li><li>类型：int，char</li></ul><p><mark>注意函数属于上一次，如果两个函数并列，别忘了把上一个函数也写上</mark></p><p><mark>先画好层次大括号图</mark></p><p><strong><font color='orange'>活动记录：</font></strong></p><ul><li>display：外层模块，存放<strong>各外层模块</strong>活动记录的基地址</li><li>压入栈：跟随运行过程，只要用到的都要压入栈</li><li>prev abp：是谁调用了本模块</li></ul><p><strong>数组需要占两行：f 和 f 模版</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412162028285.png" alt="image-20241216202841182" /></p><h3 id="ll1文法-2"><a class="markdownIt-Anchor" href="#ll1文法-2"></a> LL(1)文法</h3><p><strong><font color='orange'>求 FIRST 和 FOLLOW：</font></strong></p><p><a href="https://blog.csdn.net/RENSRM/article/details/111595754">如何求 First 集与 Follow 集（超详细）_first 集合和 follow 集合的求法-CSDN 博客</a></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412151856080.png" alt="image-20241215185602013" /></p><p><strong><font color='orange'>LL(1)文法分析表：</font></strong></p><p>将所有 FIRST 集填入到表中，如果某非终结符可以推出<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ε</mi></mrow><annotation encoding="application/x-tex">\varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，将所有其 FOLLOW 中的终结符处都填上<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">A\rightarrow \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>。</p><p><strong><font color='orange'>利用文法分析句子：</font></strong></p><p>只有非终结符遇到非终结符才会出栈，否则一直根据分析表向下分析，不继续读入符号</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111620321.png" alt="image-20241211161945074" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111622765.png" alt="image-20241211162212691" /></p><p><strong><font color='orange'>判断是否是 LL(1)文法：</font></strong></p><p>其分析表 M 不含多重定义入口（即分析表中无两条以上规则）</p><p>是 LL(1)文法的充要条件，即证明是 LL(1)文法：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412111655344.png" alt="image-20241211165530286" /></p><p><strong><font color='orange'>证明有些一定不会 LL(1)文法：</font></strong></p><p>如果 G 是左递归的，或者是二义性的文法，则至少有一个多重入口</p><p>左递归：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi><mo>:</mo><mo>:</mo><mo>=</mo><mi>U</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">U::=U...|a...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span></span></span></span></span></p><p>则有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><mi>U</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo stretchy="false">)</mo><mo>∩</mo><mi>F</mi><mi>I</mi><mi>R</mi><mi>S</mi><mi>T</mi><mo stretchy="false">(</mo><mi>a</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">FIRST(U...)\cap FIRST(a...)\neq \empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></p><p>二义性：</p><p>对文法所定义的某些句子存在两个最左推导，即在推导的某些步存在多重定义，有两条规则可用，所以分析表是多重定义的</p><h3 id="lr-分析法-2"><a class="markdownIt-Anchor" href="#lr-分析法-2"></a> LR 分析法</h3><p><strong><font color='orange'>LR(0)分析法：</font></strong></p><ul><li><p>将文法拓广，使其只有一个接受状态</p></li><li><p>列出文法的所有项目</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412152224224.png" alt="image-20241215222418150" /></p></li><li><p>将有关项目组成项目集，即为 LR(0)</p></li><li><p>计算项目集闭包 closure<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412152226578.png" alt="image-20241215222620508" /></p></li><li><p>计算状态转移函数 GOTO<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412152226859.png" alt="image-20241215222640801" /></p></li><li><p>有出边的填 Action(S)，没有出边的给拓展文法标号，填 Action®，给最初的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>E</mi><mo mathvariant="normal">′</mo></msup><mo>→</mo><mi>E</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">E&#x27;\rightarrow E.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord">.</span></span></span></span>的ACTION[k,#]=acc<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412161014383.png" alt="image-20241216101422277" /></p></li></ul><p><strong><font color='orange'>SLR(1)分析法：</font></strong></p><p>只有归约过程改变，根据文法左边非终结符的 follow 集，填入到 Action 表中，编号是产生式的编号</p><p><strong><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>→</mo><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">R\rightarrow .</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.10556em;vertical-align:0em;"></span><span class="mord">.</span></span></span></span>也要填<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>→</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">R\rightarrow \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>的序号</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412161043269.png" alt="image-20241216104347220" /></p><p><strong><font color='orange'>根据 Action 和 GOTO 表分析输入串：</font></strong></p><p>表头：状态栈，已识别符号，待输入串，动作</p><ul><li>S：移进，根据 Action</li><li>R：根据产生式归约，出栈（要根据产生式！！！），根据栈顶的状态查 GOTO 表</li></ul><p>acc：如果没有扩展文法就是第一个式子在末尾点点的时候</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171637787.png" alt="image-20241217163709727" /></p><blockquote><p>如果是要归约<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>→</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">R\rightarrow \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，那就是压入栈中 R</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412172038012.png" alt="image-20241217203816908" /></p><p><strong><font color='orange'>求活前缀：</font></strong></p><ol><li><p>短语：前面句型中的某个非终结符所能推出的符号串，由每颗子树的叶子组成</p><p><mark>任何句型本身一定是相对于识别符号 Z 的短语</mark></p><p><img src="https://img2018.cnblogs.com/blog/1483449/201906/1483449-20190621214719278-2019466211.png" alt="" /></p><p><img src="https://img2018.cnblogs.com/blog/1483449/201906/1483449-20190621214726660-1595534738.png" alt="" /></p></li><li><p>简单子树：树的高度为两层的子树</p></li><li><p>简单短语：简单子树的叶子结点</p></li><li><p>句柄：最左简单短语，最左简单子树的叶子</p></li></ol><p>活前缀：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412161418799.png" alt="image-20241216141501835" /></p><p><strong><font color='orange'>求能识别活前缀的有效项目集：</font></strong></p><p>将点点在最后一个字符的后面，然后求 closure</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412161427309.png" alt="image-20241216142726234" /></p><p><strong><font color='orange'>判断 SLR 分析法：</font></strong></p><p>如果分析表有多重定义入口，分析动作不唯一，就不是 SLR(1)</p><h3 id="代码优化"><a class="markdownIt-Anchor" href="#代码优化"></a> 代码优化</h3><p><strong><font color='orange'>构建 DAG：</font></strong></p><p>方法：</p><ul><li>建立节点表，记录了变量名和常量值，以及他们当前多对应的 DAG 图中的节点的序号。该表初始状态为空</li><li>对于形如<code>z=x op y</code>的中间代码，首先在节点表寻找 x，如果找到则记录下对应节点号 i；反之新建叶节点，假设其节点号仍为 i，标记为 x（如 x 为变量名，该标记更改为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">x_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>）；在节点表中增加新的一项（x，i），表明二者关系。y 与 x 同理。</li><li>在 DAG 寻找中间节点，标记为 op，左操作数节点号为 i，右操作数节点号为 j。如果找到记录下其节点号 k；如果未找到，在 DAG 图中新建一个中间节点，假设其节点号仍为 k，并将节点 i 和 j 分别与 k 相连，作为其左子节点和右子节点</li><li>在节点表中寻找 z，如果找到，将 z 所对应的节点号更改为 k；如果未找到，在节点表中新建一项(z, k)，表明二者之间的对应关系</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202411022113992.png" alt="image-20241102211311907" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051530555.png" alt="image-20241205153032489" /></p><p><strong><font color='orange'>导出中间代码：</font></strong></p><p>方法：</p><ol><li>初始化一个放置 DAG 图中间节点的队列</li><li>如果 DAG 图中还有<mark>中间节点</mark>未进入队列，则执行步骤 3，否则执行步骤 5</li><li>选取一个尚未进入队列，但其所有父节点均已进入队列的中间节点 n 将其加入队列；或选取没有父节点的中间节点，将其加入队列</li><li>如果 n 的最左子节点符合步骤 3 的条件，将其加入队列；并沿着当前节点的最左边，循环访问其最左子节点，最左子节点的最左子节点等，将符合步骤 3 条件的中间节点依次加入队列；如果出现不符合步骤 3 条件的最左子节点，执行步骤 2</li><li>将中间节点队列逆序输出，便得到中间节点的计算顺序，将其整理成中间代码序列</li></ol><p><strong>叶节点不属于节点，不占用最左的范围。eg：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>t</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">t_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的最左子节点为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>t</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">t_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412051554209.png" alt="image-20241205155459140" /></p><p><strong><font color='orange'>从活跃变量到冲突图：</font></strong></p><p>in 集和一个 out 集，分别表示到该语句仍然活跃的活跃变量，在该语句之后的还保持活跃的活跃变量。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><mi>u</mi><mi>s</mi><mi>e</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>∪</mo><mo stretchy="false">(</mo><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>−</mo><mi>d</mi><mi>e</mi><mi>f</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mi>o</mi><mi>u</mi><mi>t</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo><mo>=</mo><mi mathvariant="normal">所</mi><mi mathvariant="normal">有</mi><mi mathvariant="normal">后</mi><mi mathvariant="normal">继</mi><mi mathvariant="normal">的</mi><mi>i</mi><mi>n</mi><mo stretchy="false">[</mo><mi>B</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">in[B]=use[B]\cup(out[B]-def[B])\\out[B]=所有后继的in[B]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">u</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">d</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">所</span><span class="mord cjk_fallback">有</span><span class="mord cjk_fallback">后</span><span class="mord cjk_fallback">继</span><span class="mord cjk_fallback">的</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">]</span></span></span></span></span></p><p>冲突图：</p><ul><li>只有跨越基本块活跃的变量才能分配到全局寄存器：在多个 in 或 out 活跃的变量</li><li>并且活跃范围重合的变量之间 无法共享全局寄存器</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202412171834932.png" alt="image-20241217183446828" /></p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;h1 id=&quot;1-概论&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#1-概论&quot;&gt;&lt;/a&gt; 1 概论&lt;/h1&gt;
&lt;p&gt;程序设计语言：语法，语义，语用&lt;/p&gt;</summary>
      
    
    
    
    <category term="大三上" scheme="http://example.com/categories/%E5%A4%A7%E4%B8%89%E4%B8%8A/"/>
    
    
    <category term="编译原理" scheme="http://example.com/tags/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/"/>
    
    <category term="笔记" scheme="http://example.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>BUAA_OS_final</title>
    <link href="http://example.com/2024/07/24/OS/"/>
    <id>http://example.com/2024/07/24/OS/</id>
    <published>2024-07-24T15:51:36.000Z</published>
    <updated>2024-07-25T12:11:39.354Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><p><mark>关于内存地址如何转化成存储空间大小</mark></p><p>0x0000-0x1000，为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><msup><mn>6</mn><mn>3</mn></msup><mo>=</mo><msup><mn>2</mn><mn>12</mn></msup><mo>=</mo><mn>4</mn><mi>k</mi></mrow><annotation encoding="application/x-tex">16^{3}=2^{12}=4k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">6</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord">4</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>，如果按字节寻址就是4KB，按字寻址就是4k字。</p><p>0d 十进制，0b 二进制，0o 八进制</p><p><strong>透明==不可见</strong></p><p>1s=1000ms</p><p>小端：数据的<strong>低位</strong>放在<strong>低地址</strong>空间，数据的<strong>高位</strong>放在<strong>高地址</strong>空间</p><p>大端：数据的<strong>高位</strong>放在<strong>低地址</strong>空间，数据的<strong>低位</strong>放在<strong>高地址空间</strong></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406032131689.png" alt="" style="zoom:67%;" /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406032131875.png" alt="" style="zoom: 67%;" /><h1 id="引入"><a class="markdownIt-Anchor" href="#引入"></a> 引入</h1><p>冯若依曼体系结构：将程序指令存储器和数据存储器合并在一起的存储器结构</p><p>特权指令：只能在核心态执行</p><p>操作系统：<mark>管理计算机资源</mark></p><ul><li>处理机管理（进程，线程控制&amp;同步&amp;通信&amp;调度）</li><li>存储器管理（执行一个程序前需要将该程序放到内存中）</li><li>文件管理。</li><li>设备管理。（I/O摄像头的分配等等）</li></ul><p>用户接口：</p><ul><li>程序接口：通过<mark>系统调用</mark>请求OS为其提供服务。GUI——调用程序接口实现。<mark>系统调用是提供给应用程序的接口，只能通过用户程序间接使用</mark></li><li>命令接口：<ul><li>联机命令接口：命令行一条命令，系统就响应一条。</li><li>脱机命令接口：<code>*.bat</code>文件集合多条命令。</li></ul></li></ul><p><strong>api和abi</strong></p><blockquote><p>abi：应用程序二进制接口，应用程序和操作系统之间。<strong>保证编译好的（二进制）代码，可以在 ABI 兼容的系统上都能运行</strong></p><p>api：programing应用程序编程接口，应用程序与开发人员之间，<strong>库函数</strong>。</p><p>区别：</p><ul><li>描述的内容不同。ABI 规定了二进制文件的格式、内容、装载/卸载程序的要求、函数调用时的参数传递规则、寄存器、堆栈的使用；API 规定操作系统、硬件平台、服务组件、语言函数库等需要提供的功能函数接口。</li><li>作用的层面不同。ABI描述二进制层面的接口，API描述代码级层面的接口。</li><li>兼容的难度不同。ABI的兼容程度比API更为严格，即ABI实现兼容更加困难。</li></ul></blockquote><h2 id="操作系统发展"><a class="markdownIt-Anchor" href="#操作系统发展"></a> 操作系统发展</h2><p><font color='orange'>手工操作阶段</font></p><p>用户独占全机，资源利用率低。</p><p><font color='orange'>批处理系统</font></p><p>CPU和I/O设备之间速度不匹配。</p><p>解决：将用户提交的作业成批送入计算机，作业调度程序自动选择作业运行。</p><p><strong>联机&amp;脱机</strong><font color="blue">[你航]</font></p><ul><li>联机批处理：作业的输入输出由CPU处理，缩短了建立作业和人工操作时间。（输入输出时CPU仍处于空闲状态）</li><li>脱机批处理：克服高速主机与慢速外设的矛盾，增加专门用于输入输出的卫星机，利用其完成输入输出，主机与卫星机并行工作。使主机摆脱I/O操作。<ul><li>优：主机不直接与慢速的输入&amp;输出打交道</li><li>缺：内存仅存放一道作业，CPU等待低速的I/O作业</li></ul></li></ul><p><strong>单道&amp;多道</strong></p><ul><li>单道批处理系统：监督程序控制作业的输入/输出，但串行。内存中只有一道程序。</li><li>多道批处理系统：类似于流水线，多道程序并发执行，用户无法调试。允许多个程序同时进入内存并允许他们在CPU中交替运行（遇到I/O切换程序）<ul><li>优：吞吐量大，资源利用率高，系统开销小</li><li>缺：<mark>平均周转时间长，交互能力差</mark></li></ul></li></ul><p><font color='orange'>分时系统</font></p><p>多个用户分享使用同一台计算机，但每个人都认为独占一个计算机。多个程序分时共享硬件和软件资源。把CPU处理时间分成时间片，按时间片轮流把处理器分配给不同程序，可人机交互。<strong>交互性作业</strong></p><p><strong>缺点：不能优先处理紧急任务</strong></p><p><font color='orange'>实时系统</font></p><p>优先紧急任务</p><p><font color="orange">网络操作系统和分布式计算机系统</font></p><p>网络操作系统：在传统单机OS上加单独软件层，主要提供联网功能和资源的远程访问，实现多机互联，通信。<strong>集中控制</strong></p><p>分布式计算机系统：系统中任意两台计算机通过通信方式交换信息，不同：<strong>分布式操作系统中的若干计算机相互协同完成同一任务</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031921729.png" alt="" /></p><h2 id="特征"><a class="markdownIt-Anchor" href="#特征"></a> 特征</h2><h3 id="并发"><a class="markdownIt-Anchor" href="#并发"></a> 并发</h3><p>两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的，但微观是交替发生。【并发性通过分时实现，进程——并发执行】</p><p>&amp;并行：两个或多个事件同一时刻同时发生。</p><p>单核CPU同一时刻只能执行一个程序，各个程序只能并发执行。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031843695.png" alt="" /></p><p>eg：显示屏与打印机，设备与设备</p><h3 id="共享"><a class="markdownIt-Anchor" href="#共享"></a> 共享</h3><p>资源共享，系统中的资源可供内存中多个并发执行的进程共同使用。</p><ul><li>互斥共享：一个时间段只允许一个进程访问该资源。</li><li>同时共享：多个“同时”。</li></ul><h3 id="虚拟"><a class="markdownIt-Anchor" href="#虚拟"></a> 虚拟</h3><p>指把一个物理上的实体变为若干个逻辑上的对应物。</p><p>程序同时运行的内存远大于实际。空分复用技术（虚拟存储器技术），时分复用技术（虚拟处理器）。</p><h3 id="异步"><a class="markdownIt-Anchor" href="#异步"></a> 异步</h3><p>多道程序环境下，允许多个程序并发执行，但由于资源有限，进程的执行走走停停，以不可预知的速度向前推进（被阻塞）。</p><h2 id="运行机制"><a class="markdownIt-Anchor" href="#运行机制"></a> 运行机制</h2><p>程序状态字寄存器：1“内核态”，0“用户态”。</p><ul><li>内核态：运行内核程序，执行特权指令。<mark>连接硬件与应用程序</mark><ul><li>与硬件关联紧密：时钟管理，中断处理（保护和恢复中断现场），设备驱动。</li><li>运行频率高：进程管理，存储器管理，设备管理。</li></ul></li><li>用户态：运行应用程序，执行非特权指令。</li></ul><p>刚开机，启动内核程序；之后主动将CPU让给应用程序，进入用户态。</p><h2 id="系统调用"><a class="markdownIt-Anchor" href="#系统调用"></a> 系统调用</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024334.png" alt="" /></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024550.png" alt="" style="zoom:50%;" /><p>库函数封装调用系统调用。陷阱，运行在核心态。</p><p>凡是与共享资源有关的操作，都必须通过统一系统调用的发生向内核提出服务请求。</p><blockquote><p>是用户进程进入内核的接口层，本身不是内核函数，由内核函数实现。“类似于封装”</p></blockquote><h2 id="体系结构"><a class="markdownIt-Anchor" href="#体系结构"></a> 体系结构</h2><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024482.png" alt="" style="zoom:50%;" /><p>大内核：也包含进程管理、存储器管理、设备管理等（Linux，Windows）。</p><p>微内核：只包含时钟管理，中断处理。（上述只能运行在用户态，对性能造成影响）</p><ul><li>优点：内核容易实现，可移植性好，配置灵活。</li><li>缺点：速度慢。用户态和内核态相互切换频率高。</li></ul><h2 id="中断和异常"><a class="markdownIt-Anchor" href="#中断和异常"></a> 中断和异常</h2><p>陷阱和中断。</p><p><strong>同步&amp;异步</strong><font color="blue">[你航]</font></p><ul><li>同步异常：它是某一特定指令执行的结果。在相同条件下，异常可以重现。例如内存访问错误、调试指令以及被零除。</li><li>异步异常：不可预知。</li></ul><p><mark>中断是异步异常</mark>，可能随时发生，与处理器正在执行的内容无关。中断主要由I/O设备、处理器时钟或定时器产生，可以被启用或禁用。</p><p>系统调用=陷阱trap。</p><p>软件和硬件都可以产生中断（异常？），软件中断常称为陷阱trap</p><ul><li>陷阱(trap)帧：完整的线程描述表的子集，用于现场保护。</li><li>陷阱处理程序处理少量事件，多数转交给其他的内核或执行体模块处理。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031718828.png" alt="" /></p><h3 id="基本原理"><a class="markdownIt-Anchor" href="#基本原理"></a> 基本原理</h3><p>不同的中断信号，使用不同的中断程序处理。查询中断向量表，找到中断处理程序在内存中存放的位置。</p><p>当产生中断信号时，操作系统会抢夺CPU重回内核态，执行中断的内核程序。</p><p><mark>没有中断就没有多道程序并发</mark></p><h1 id="链接与装载"><a class="markdownIt-Anchor" href="#链接与装载"></a> 链接与装载</h1><ul><li>编译：由编译程序将用户源代码编译成若干目标模块</li><li>链接：由链接程序将编译后的一组目标模块，以及它们所需的库函数链接在一起，形成一个完整的装入模块</li><li>装载/装入：由装入程序将装入模块装入内存运行<ul><li>绝对装入：编译时产生绝对地址。（单道程序阶段：整个内存只有两个程序：用户程序和os）</li><li>可重定位装入：装入时将逻辑地址转换为物理地址（多道）</li><li>动态重定位：运行时将逻辑地址转换为物理地址，需要设置重定位寄存器（现代）</li></ul></li></ul><h2 id="链接"><a class="markdownIt-Anchor" href="#链接"></a> 链接</h2><p>链接：将各种代码和数据片段收集并组合成为一个单一文件的过程，这个文件可被加载到内存并执行。</p><p>作用：分离编译，多人协作。</p><p>编译-&gt;汇编-&gt;链接</p><h4 id="可执行文件格式elf"><a class="markdownIt-Anchor" href="#可执行文件格式elf"></a> 可执行文件格式（ELF）</h4><h5 id="结构"><a class="markdownIt-Anchor" href="#结构"></a> 结构</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024117.png" alt="" /></p><ul><li><p>ELF头</p><p>描述生成该文件的系统和字的大小和字节顺序（大小端存储模式）</p><p>帮助链接器语法分析和解释目标文件的信息。</p></li><li><p>节</p><ul><li><p>.text：已编译程序的机器代码。</p></li><li><p>.rodata：只读数据。<mark>const</mark>常量。</p></li><li><p>.data：<strong>已初始化</strong>的静态变量（当前模块内所有函数可见，模块外不可见）和已初始化的全局变量</p></li><li><p>.bss</p><ul><li><strong>未初始化和初始化为0</strong>的全局变量（所有模块可见）和未初始化的静态变量</li><li>局部 C 变量在运行时被保存在栈中</li><li>malloc出的区域在堆中</li></ul></li><li><p>.symtab：符号表。定义和引用的函数和全局变量的信息。<mark>每一个可重定位目标文件都有一张符号表</mark>。</p></li><li><p>.rel.text:  .text 节的重定位信息</p><p>在合并生成可执行文件时需要修改的指令的指针<br />如：任何调用外部函数或者引用全局变量的指令</p></li><li><p>.rel.data（.rel.data.rel）:   .data节的重定位信息<br />在合并生成可执行文件时需要修改的数据的指针<br />任何已初始化的全局变量，如果它的初始值是一个全局变量地址或者外部定义函数的地址，都需要被修改</p></li><li><p>.debug、.line：调试符号表</p></li><li><p>.strtab:  字符串表</p></li></ul></li><li><p>节头部表</p><p>描述各节的位置和大小，其中目标文件中每个节都有一个固定大小的条目 (项，entry)</p></li></ul><h2 id="装载和运行"><a class="markdownIt-Anchor" href="#装载和运行"></a> 装载和运行</h2><p>装载前的工作：shell调用fork()系统调用，创建一个子进程。</p><p>装载：可执行文件按照文件中的段映射（加载）到虚拟地址空间。（子进程调用execve()加载program）</p><p>加载：加载器在加载程序的时候看ELF文件和segment相关的信息。</p><p><mark>Type为Load的segment需要被加载到内存中的部分</mark></p><p>不一定全部加载到内存，如果文件中的大小小于在内存中的大小，补零。</p><blockquote><p>程序在装入时是否分配物理内存？不一定立即分配物理内存。</p><p>ELF的program header和section header分别起到什么作用？section header用来描述每个section的特性，如大小、类型、名称等等。program header用于描述segment的特性。</p></blockquote><h1 id="内存管理"><a class="markdownIt-Anchor" href="#内存管理"></a> 内存管理</h1><p>程序执行前需要先放到内存中才能被CPU处理。</p><ul><li>字word：看计算机有可能是32/16.</li><li>字节Byte：1Byte=8bit。</li><li>位bit：二进制位。</li></ul><p><mark>地址独立</mark>：无需知道物理内存的地址。</p><p><mark>存储保护</mark>：保证各进程在自己的内存空间内运行，不会越界访问。</p><ul><li>设置上下限寄存器：只有在两者之间才能访问。</li><li>重定位寄存器：存放进程的起始物理地址。界地址寄存器：最大逻辑地址。</li></ul><p>功能：</p><ul><li>存储分配和回收。</li><li>地址变换。</li><li>存储共享和保护。</li><li>存储器扩充。</li></ul><p>SRAM:读写速度快，成本高，Cache。</p><p>DRAM:读写速度慢，急程度高，容量大，主存。</p><p>存储层次结构：寄存器-Cache-主存-外存。</p><h2 id="内存空间的分配与回收"><a class="markdownIt-Anchor" href="#内存空间的分配与回收"></a> 内存空间的分配与回收</h2><ul><li><mark>内碎片：已经被分配出去（明确说出哪个进程）但不能被利用。单道连续分配）</mark></li><li><mark>外碎片：还没有被分配出去（不属于任何进程），但由于太小了无法分配给申请内存。</mark></li></ul><h3 id="连续分配"><a class="markdownIt-Anchor" href="#连续分配"></a> 连续分配</h3><p>装入连续物理地址空间</p><h4 id="单一连续分配"><a class="markdownIt-Anchor" href="#单一连续分配"></a> 单一连续分配</h4><p>内存只有两个程序：系统区，用户区。内存中一道用户程序，独占整个用户区空间。运行前计算所有物理地址。</p><ul><li>静态地址翻译：即在程序运行之前就计算出所有物理地址。</li><li>静态翻译工作可以由加载器实现。</li></ul><p>优点：实现简单，没有外部碎片。</p><p>缺点：只能用于单用户、单任务，有内部碎片。</p><h4 id="固定分区分配"><a class="markdownIt-Anchor" href="#固定分区分配"></a> 固定分区分配</h4><p>分区：把内存分为一些大小相等或不等的分区，每个应用程序占用一个或几个分区。操作系统占用其中一个分区**。**</p><p>固定式分区：程序适应分区。</p><ul><li>分区大小相等：多个相同程序的并发执行。（控制多个相同对象）</li><li>分区大小不等：小中大，根据程序大小分配不同分区。（内碎片浪费）</li></ul><p>优点：没有外部碎片。</p><p>缺点：程序太大，不得不采用覆盖，降低性能；有内碎片。</p><h5 id="加载程序"><a class="markdownIt-Anchor" href="#加载程序"></a> 加载程序</h5><ul><li><p>单一队列分配方式：选择一个当前闲置且容量足够大的分区进行加载**，<strong>可采用共享队列的固定分区</strong>（**多个用户程序排在一个共同的队列里面等待分区）分配。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024154.png" alt="" /></p></li><li><p>多队列：每个大小不同的分区都有一个队列，根据程序所需内存大小排在相应的队列。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024419.png" alt="" /></p></li></ul><h4 id="可变式分区"><a class="markdownIt-Anchor" href="#可变式分区"></a> 可变式分区</h4><p>分区大小可变。（有外碎片，无内碎片）</p><h5 id="跟踪内存使用"><a class="markdownIt-Anchor" href="#跟踪内存使用"></a> 跟踪内存使用</h5><h6 id="位图表示法空闲分区表"><a class="markdownIt-Anchor" href="#位图表示法空闲分区表"></a> 位图表示法（空闲分区表）</h6><p>给每个分配单元赋予一个二进制数位，用来记录该分配单元是否闲置。（空间开销固定，时间开销低，没有容错能力）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024595.png" alt="" /></p><h6 id="链表表示法空闲分区链"><a class="markdownIt-Anchor" href="#链表表示法空闲分区链"></a> 链表表示法（空闲分区链）</h6><p>将分配单元按照是否闲置链接起来。（空间开销取决于程序数量，时间开销大，有一定容错能力链表有被占空间和闲置空间相互验证）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024827.png" alt="" /></p><h5 id="可变分区管理"><a class="markdownIt-Anchor" href="#可变分区管理"></a> 可变分区管理</h5><p>已分配分区表，未分配分区表。</p><ul><li>分配内存：<code>&lt;=size</code>不再进一步分割。<code>m.size（空闲分区）-u.size（请求分区）&lt;=size</code>，将该分区从分区表/链中移除，否则画出<code>u.size</code>分区。</li></ul><h5 id="回收内存"><a class="markdownIt-Anchor" href="#回收内存"></a> 回收内存</h5><p>相邻分区合并。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062024121.png" alt="" style="zoom:80%;" /><h5 id="分配算法"><a class="markdownIt-Anchor" href="#分配算法"></a> 分配算法</h5><h6 id="分配算法基于顺序搜索"><a class="markdownIt-Anchor" href="#分配算法基于顺序搜索"></a> 分配算法（基于顺序搜索）</h6><ul><li>首次适应：按<mark>地址递增</mark>顺序排序，选择第一个满足要求的。空闲分区以地址递增的次序排列，按顺序查找空闲分区链&amp;表。<ul><li>低地址不断划分，出现小碎片。</li><li>每次从低地址开始，增加查找可用分区的开销。</li></ul></li><li>下次适应：循环列表，从上次查找结束的地方开始。以地址递增的循环列表。<ul><li>空间利用更加均衡，不会非小的集中在一端。缺乏大的空闲分区。</li></ul></li><li>最佳适应：选择大小最接近的。按容量递增次序排列。<ul><li>小碎片。</li></ul></li><li>最坏适应：寻找最大的空闲区。按容量递减次序排列。<ul><li>大作业申请得不到满足。</li></ul></li></ul><h6 id="分配算法基于索引"><a class="markdownIt-Anchor" href="#分配算法基于索引"></a> 分配算法（基于索引）</h6><p>适合小系统，否则空闲分区表/链很大，检索速度慢。</p><ul><li>快速适应：按容量大小分类，常用大小的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。<ul><li>效率高，仅需要根据程序长度，找到能容纳最小空闲区链表，取下第一块。</li><li>不会分割分区，不产生内存碎片。取下某链表第一个即可。</li><li>回收算法复杂。</li></ul></li><li>伙伴系统：（linux）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>&lt;</mo><mi>x</mi><mo>&lt;</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^{n-1}&lt;x&lt;2^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.853208em;vertical-align:-0.0391em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.664392em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>，如果找不到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.664392em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>就找<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">2^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span>再切割成两个相等的（伙伴）。<ul><li>两个块合并成一个更大的块，首地址必须是块大小的整数倍</li><li>伙伴地址： 两个大小相同的相邻块合并成一个更大的块时，<strong>首地址必须是块（合成后的块2倍）大小的整数倍</strong>。</li><li><strong>并不是任意两个相同大小的内存区块都是伙伴</strong></li></ul></li></ul><h6 id="消除外部碎片紧凑技术"><a class="markdownIt-Anchor" href="#消除外部碎片紧凑技术"></a> 消除外部碎片：紧凑技术。</h6><p>消除外部碎片，使本来分散的多个小空闲分区连成一个大的空闲区。挪位。</p><p>紧凑时机：找不到足够大的空闲分区且总空闲分区容量可以满足作业要求。</p><p><mark>实现支撑——动态重定位：挪位。进程起始地址，重定位寄存器中修改。</mark></p><h4 id="多重分区分配"><a class="markdownIt-Anchor" href="#多重分区分配"></a> 多重分区分配</h4><p>将一道作业分成若干片段，增加程序短表，涉及到存储保护。</p><ul><li>界限寄存器方法：上下界寄存器，基址、限长寄存器。</li><li>存储保护键：每个存储块保护键，每个进入系统的作业保护键，两者不匹配则停止运行。</li></ul><h3 id="覆盖与交换"><a class="markdownIt-Anchor" href="#覆盖与交换"></a> 覆盖与交换</h3><p><mark>解决大作业在小内存中的运行问题</mark></p><h4 id="覆盖"><a class="markdownIt-Anchor" href="#覆盖"></a> 覆盖</h4><p>将程序划分为若干个功能上相对独立的程序段，按照程序的逻辑结构让那些不会同时执行的程序段共享同一块内存区的内存扩充技术。</p><p><strong>对用户不透明，增加了用户负担</strong></p><h4 id="交换"><a class="markdownIt-Anchor" href="#交换"></a> 交换</h4><p>将系统暂时不用的程序或数据部分或全部从主存中调出，以腾出空间将系统要求使用的程序和数据调入主存，实际上是主存与外存之间不断的交换程序和数据，以实现用户在较小的存储空间中完成较多作业的执行。</p><ul><li>优点：增加并发运行的程序数目，并且给用户提供适当的响应时间；编写程序时不影响程序结构</li><li>缺点：对换入和换出的控制增加处理机开销；程序整个地址空间都进行传送，没有考虑执行过程中地址访问的统计特性</li></ul><blockquote><p>换出等待I/O的进程</p><p>何时交换：不用&amp;内存空间不够</p><p>交换时工作：保存前一个进程的运行现场——寄存器，堆栈；创建新进程的运行现场</p><p>换回：恢复</p></blockquote><h4 id="区别"><a class="markdownIt-Anchor" href="#区别"></a> 区别</h4><p>一、结构不同</p><p>1、覆盖：要求程序员给出程序段之间的覆盖结构。</p><p>2、交换：不要求程序员给出程序段之间的交换结构。</p><p>二、进行不同</p><p>1、覆盖：主要在同一个作业或同一个进程内进行。</p><p>2、交换：主要是在进程或作业之间进行。</p><p>三、减少不同</p><p>1、覆盖：减少一个程序运行所需的空间。</p><p>2、交换：可让整个程序暂存于外村中，让出内存空间。</p><h3 id="非连续分配"><a class="markdownIt-Anchor" href="#非连续分配"></a> 非连续分配</h3><p><mark>充分利用空间，减少移动带来的开销</mark></p><h4 id="页式内存管理"><a class="markdownIt-Anchor" href="#页式内存管理"></a> 页式内存管理</h4><p><font color='orange'><strong>对用户透明</strong></font></p><ul><li>纯分页：不支持换页，不支持虚拟存储器功能，必须一次全装入主存，否则不能运行<ul><li>没有外碎片，有内碎片</li><li>一个程序不必连续存放</li></ul></li><li>请求分页：不一次性装入</li></ul><h5 id="一级页表"><a class="markdownIt-Anchor" href="#一级页表"></a> 一级页表</h5><p>把一个逻辑地址连续的程序分散存放到若干不连续的内存区域。</p><ul><li><p>页&amp;页面（虚拟）：把每个作业&amp;进程的地址空间分成一些大小相等的片。从0开始编号。</p></li><li><p>页框（物理）：把内存分成与页面大小相同的片。</p></li></ul><p><mark>进程的页面与内存的页框一一对应</mark></p><p>页表：每个进程配置一张页表。页表的基址及长度由页表寄存器给出。页号-块号：实际只需存储块号，页号用数组下标表示。<mark>只是存放块号而不是地址</mark>。<strong>需要块号*内存块大小！</strong><font color="red">存放在内存中，访问数据需要访存2次，页表1次，内存1次。</font></p><ul><li>是否在内存中的标识位。</li><li>算法换出的标识位。</li><li>页面是否改动的脏位。</li></ul><p>页表项个数=页面数</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406032113519.png" alt="" /></p><h6 id="font-colorred-font-weightbold逻辑地址到物理地址的转换font"><a class="markdownIt-Anchor" href="#font-colorred-font-weightbold逻辑地址到物理地址的转换font"></a> <font color='red' font-weight='bold'>*逻辑地址到物理地址的转换</font></h6><ul><li>页表项位置=页表基地址+页号*页表项长度</li><li>根据页表项位的信息获得页框号。</li><li>物理地址：页框号*页大小+页内偏移（按字寻址&amp;按字节寻址）<mark>1字节=8位  1字=2字节（16位） 1字=4字节（32位）1字=8字节（64位）  1字节=16进制两位（一定注意前面为0的别漏数！！！）</mark></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062025581.png" alt="" /></p><p>问题：逻辑地址空间很大，页表更大？实现困难。解决：多级页表。</p><h5 id="多级页表"><a class="markdownIt-Anchor" href="#多级页表"></a> 多级页表</h5><p>把外部页表（页表的页表：页表号-内存块号）调用到内存，动态调入内部页表。</p><p>将一级页表拆分，每个小分组刚好可以装入一个内存块。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062025555.png" alt="" /></p><p>由一级页号获得二级页表存放的位置，通过二级页号获得内存中存放的位置。</p><p>一级页号/页表项大小=一级页号</p><p><mark>二级页表大小与页面大小相同，即页表项大小*个数</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062025626.png" alt="" /></p><p>问题：<strong>内存访问效率降低</strong>，由原先的1次增加为3次！（二级页表）解决：快表。</p><h5 id="快表tlb"><a class="markdownIt-Anchor" href="#快表tlb"></a> 快表TLB</h5><p>CPU产生逻辑地址的页号，首先在TLB中寻找，命中直接找出；未命中从页表中找出，再将相应页表项复制到快表。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062025275.png" alt="" /></p><p>有效内存访问时间：a为TLB命中率</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>E</mi><mi>A</mi><mi>T</mi><mo>=</mo><mi>a</mi><mo stretchy="false">(</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">次</mi><mi mathvariant="normal">内</mi><mi mathvariant="normal">存</mi><mi mathvariant="normal">访</mi><mi mathvariant="normal">问</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>+</mo><mi>T</mi><mi>L</mi><mi>B</mi><mi mathvariant="normal">查</mi><mi mathvariant="normal">询</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo stretchy="false">)</mo><mo>+</mo><mspace linebreak="newline"></mspace><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">次</mi><mi mathvariant="normal">内</mi><mi mathvariant="normal">存</mi><mi mathvariant="normal">访</mi><mi mathvariant="normal">问</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>×</mo><mn>2</mn><mo>+</mo><mi>T</mi><mi>L</mi><mi>B</mi><mi mathvariant="normal">查</mi><mi mathvariant="normal">询</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mo>=</mo><mn>2</mn><mo>∗</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">次</mi><mi mathvariant="normal">内</mi><mi mathvariant="normal">存</mi><mi mathvariant="normal">访</mi><mi mathvariant="normal">问</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>+</mo><mi>T</mi><mi>L</mi><mi>B</mi><mi mathvariant="normal">查</mi><mi mathvariant="normal">询</mi><mo>−</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">次</mi><mi mathvariant="normal">内</mi><mi mathvariant="normal">存</mi><mi mathvariant="normal">访</mi><mi mathvariant="normal">问</mi><mo>∗</mo><mi>a</mi><mspace linebreak="newline"></mspace><mo>=</mo><mo stretchy="false">(</mo><mn>2</mn><mo>−</mo><mi>a</mi><mo stretchy="false">)</mo><mo>∗</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">次</mi><mi mathvariant="normal">内</mi><mi mathvariant="normal">存</mi><mi mathvariant="normal">访</mi><mi mathvariant="normal">问</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>+</mo><mi>T</mi><mi>L</mi><mi>B</mi><mi mathvariant="normal">查</mi><mi mathvariant="normal">询</mi></mrow><annotation encoding="application/x-tex">EAT=a(单次内存访问时间+TLB查询时间)+\\(1-a)(单次内存访问时间\times2+TLB查询时间)\\=2*单次内存访问时间+TLB查询-单次内存访问*a\\=(2-a)*单次内存访问时间+TLB查询</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mopen">(</span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">次</span><span class="mord cjk_fallback">内</span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">访</span><span class="mord cjk_fallback">问</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback">查</span><span class="mord cjk_fallback">询</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">次</span><span class="mord cjk_fallback">内</span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">访</span><span class="mord cjk_fallback">问</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback">查</span><span class="mord cjk_fallback">询</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">次</span><span class="mord cjk_fallback">内</span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">访</span><span class="mord cjk_fallback">问</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback">查</span><span class="mord cjk_fallback">询</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.46528em;vertical-align:0em;"></span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">次</span><span class="mord cjk_fallback">内</span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">访</span><span class="mord cjk_fallback">问</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">次</span><span class="mord cjk_fallback">内</span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">访</span><span class="mord cjk_fallback">问</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord cjk_fallback">查</span><span class="mord cjk_fallback">询</span></span></span></span></span></p><ul><li>访问TLB=访问TLB+查询</li><li>访问内存中页表+访问内存</li></ul><h6 id="哈希页表"><a class="markdownIt-Anchor" href="#哈希页表"></a> 哈希页表</h6><p>通过虚拟页号的哈希值访问页表，每个页表项是一个链表，如果虚拟地址与两表中元素的第一个域相同，则匹配，第二个域形成物理地址。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062023365.png" alt="" /></p><h6 id="反置页表"><a class="markdownIt-Anchor" href="#反置页表"></a> 反置页表</h6><p>index——物理块号，每个页表项存放使用进程的pid和逻辑页号</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051304743.png" alt="" /></p><p>如果检索整个页表都没有找到——缺页</p><p>不根据进程的逻辑页号组织，只与物理内存大小有关</p><h5 id="页共享与保护"><a class="markdownIt-Anchor" href="#页共享与保护"></a> 页共享与保护</h5><p>共享：需共享的数据&amp;代码的相应页面指向相同页框</p><p>问题：共享数据域不共享数据划在同一页框中，不易保密——分段存储管理 <mark>页式管理缺点：共享数据不方便！！！</mark></p><p>保护：</p><ul><li>地址越界保护</li><li>在页表中设置保护位：W，R，W/R</li></ul><h4 id="段式内存管理"><a class="markdownIt-Anchor" href="#段式内存管理"></a> 段式内存管理</h4><p><font color='orange'><strong>对用户可见，可以在用户编程时确定</strong></font></p><p>页式问题：难以满足程序运行时对内存的<strong>动态需求</strong>。<strong>不便于数据共享与保护</strong>。</p><p>段式（可变的页）：按照程序自身的逻辑关系分成若干个段。<mark>编程时需要显式给出段号、段内地址</mark></p><p>段表：保存在内存，基址及长度由段表寄存器给出。</p><ul><li><p>段表寄存器：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062026447.png" alt="" /></p></li><li><p>逻辑地址：</p><table><thead><tr><th>31 …16</th><th>15 … 0</th></tr></thead><tbody><tr><td>段号（位数决定的每个进程最多分几段</td><td>段内地址（位数决定了每个段最大长度）</td></tr></tbody></table></li><li><p>段表（每个段表项长度相同，段号隐含）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062027310.png" alt="" /></p></li></ul><h5 id="地址转换"><a class="markdownIt-Anchor" href="#地址转换"></a> 地址转换</h5><ul><li>段表项地址=段号*段表项长度+段表始址。从而获得段长和基址。</li><li>判断逻辑地址中的段号S和段长TL，如果S&gt;TL，访问越界，产生越界中断。</li><li>基址与段内地址相加获得要访问的物理地址。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062027502.png" alt="" /></p><h5 id="信息共享"><a class="markdownIt-Anchor" href="#信息共享"></a> 信息共享</h5><p>不同进程可以共享可重入代码（纯代码，多次并发调用安全运行，不能使用全局&amp;静态变量，不能修改代码本身）</p><p>优点：易于共享与保护，支持动态的内存需要</p><p>缺点：地址变换浪费时间，产生外部碎片（可通过紧凑解决，但时间代价大），辅存中管理不定长度的分段困难。</p><p>页式善于管理物理地址，段式善于管理逻辑地址。</p><p><strong>为什么页式是一维，段式是二维？</strong></p><p>页式虚拟地址从0一直到最大gb，是连续的；段式是好多个从0-特定的地址。分成好多段，数据段、代码段等等，段与段之间不是连续的地址。</p><p>页式给一个虚拟地址，可以自动划分页号和页内偏移，系统自动生成；段式程序员自己设定段号。</p><p><strong>省流：需要段长和段基址两个值才能确定某段</strong></p><h4 id="段页式存储管理"><a class="markdownIt-Anchor" href="#段页式存储管理"></a> 段页式存储管理</h4><p>将进程先分段（编程实现）再分页（对用户不可见），再存放在内存中</p><p>逻辑地址：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062032723.png" alt="" /></p><ul><li>段号：每个进程最多分几段。</li><li>页号：位数每个段最大有几页。</li><li>页内偏移量：决定页面大小，内存块大小。</li></ul><h5 id="地址转换-2"><a class="markdownIt-Anchor" href="#地址转换-2"></a> 地址转换</h5><p>每个进程一张段表，每个段一张页表。<strong>段表中存放页表存放块号和页表长度</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062032384.png" alt="" /></p><p>三次访存：1.根据段号查取页表长度和页表存放块号。2.根据页表存放块号访问页表获得内存块号。3.访存。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062034795.png" alt="" style="zoom:80%;" /><h5 id="x86"><a class="markdownIt-Anchor" href="#x86"></a> X86</h5><p>段映射机制：逻辑地址——线性地址</p><p>页映射机制：线性地址——物理地址</p><p>全局描述符表GDT：段描述符</p><p>局部描述符表LDT：专属于某个任务的段描述符</p><h2 id="内存空间的扩充"><a class="markdownIt-Anchor" href="#内存空间的扩充"></a> 内存空间的扩充</h2><h3 id="虚拟内存管理"><a class="markdownIt-Anchor" href="#虚拟内存管理"></a> 虚拟内存管理</h3><h4 id="局部性问题"><a class="markdownIt-Anchor" href="#局部性问题"></a> 局部性问题</h4><p>空间局部性：刚访问过的存储单元的临近单位访问的可能性很高。</p><p>时间局部性：刚访问过的不能不久后会被再次访问。</p><p>虚拟存储提供3种能力：</p><ul><li>给所有进程提供一致的地址空间。</li><li>保护每个进程的地址空间不被其他进程破坏。</li><li>把主存作为磁盘的高速缓存。</li></ul><p><strong>原理</strong></p><p>程序装入时，不需要将全部读入内存（与覆盖不同，os自动完成，对程序员透明），程序执行时可以换入换出（比交换更小颗粒度）。</p><p>虚拟存储技术特征：</p><ul><li>离散型。物理内存分配不连续。</li><li>多次性。作业被多次调入内存。</li><li>对换性。允许作业换入换出。</li><li>虚拟性：允许程序从逻辑的角度访存存储器，而不考虑物理内存上可用的空间容量。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062036163.png" alt="" /></p><h4 id="与cache主存的异同"><a class="markdownIt-Anchor" href="#与cache主存的异同"></a> 与Cache主存的异同</h4><p>相同点：</p><ul><li>出发点相同：提高存储系统的性能。</li><li>原理相同：利用程序运行时的局部性原理把最近的常用信息快调入相对高速而小容量的存储器。</li></ul><p>不同点：</p><ul><li>侧重点不同：cache解决主存与CPU的速度差异。虚存解决存储容量问题。</li><li>数据通路不同：CPU与cache和主存之间有直接访问通路，而虚存如果主存不命中只能通过调页解决。</li><li>透明性不同：<strong>cache管理由硬件完成</strong>，对系统程序员和应用程序员完全透明；<strong>虚存由os和硬件共同完成</strong>，对系统程序员不透明，对应用程序员透明。</li><li>未命中的损失不同：主存未命中的性能损失远大于cache未命中。</li></ul><h4 id="请求分页管理方式"><a class="markdownIt-Anchor" href="#请求分页管理方式"></a> 请求分页管理方式</h4><p>程序执行过程中，所访问的信息不在内存中，由os负责将所需信息从外存调入内存。若内存空间不够，os将内存中暂时用不到的信息换出到外存。</p><ul><li>硬件支持：请求分页的页表机制，缺页中断机构和地址变换机构。</li><li>软件支持：请求调页功能和页置换功能的软件。</li></ul><p>要解决的问题：</p><ul><li>地址映射问题：进程空间到虚拟存储的映射</li><li>调入问题：哪些程序和数据应被调入，调入机制</li><li>替换问题：哪些程序和数据被调出主存</li><li>更新问题：主存和赋存的一致性</li><li>其他：存储保护和程序重定位</li></ul><p>（进程的）虚拟地址空间=虚拟存储空间，都从0开始编址。</p><p>交换分区：<strong>连续的磁盘空间</strong>（按页划分），对用户不可见。物理内存不够时，os把内存中暂时不用的数据放在这里。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062037179.png" alt="" /></p><h5 id="地址映射问题"><a class="markdownIt-Anchor" href="#地址映射问题"></a> 地址映射问题</h5><p>程序装入时，由装载器Loader完成。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062039209.png" alt="" /></p><ul><li>驻留位：1表示在内存中，0表示在外存中。</li><li>保护位：只读，可写，可执行。</li><li>修改位：此页在内存中是否被修改过。</li><li>访问位：页面置换算法。</li></ul><h5 id="调入问题"><a class="markdownIt-Anchor" href="#调入问题"></a> 调入问题</h5><ul><li>预调页：事先调入页面的策略。</li><li>按需调页：仅当需要时才调入页面的策略。</li></ul><p>缺页异常&amp;中断处理机制。（懒惰交换）</p><p>为每个进程维护一个当前工作集合，如果进程在暂停之后需要重启时，根据这个列表使用预调页将所有工作集合中的页一次性调入内存。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051400127.png" alt="" style="zoom:80%;" /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051400576.png" alt="" style="zoom:80%;" /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051401612.png" alt="" style="zoom:80%;" /><h5 id="页面置换"><a class="markdownIt-Anchor" href="#页面置换"></a> 页面置换</h5><ul><li>最优置换：选择最长时间不需要访问的页面。（用于比较性研究）</li><li>先进先出：选择在主存驻留时间最长的一页淘汰。<ul><li>性能较差，Belady异常（分配的页框增多，缺页率反而提高）</li></ul></li><li>second chance（改进FIFO）：如果被淘汰的数据之前被访问过，则给第二次机会，同时清除标志位，否则直接淘汰。</li><li>clock（改进FIFO）：环形循环指针。<ul><li>无缺页错误：将访问页置1，指针不动</li><li>产生：<ul><li>当前为1：置0，向前移，直至找到0，到当前为0的情况</li><li>当前为0：替换，将其置1，向前移一位</li></ul></li></ul></li><li>最近最少使用LRU：选择在最近一段时间内最久不用的页面。<ul><li>命中时：所有块的计数值与命中块的计数值比较，<ul><li><p>如果某块计数值小于命中块的计数值， 则该块的计数值加 1</p></li><li><p>如果该块的计数值大于命中块的计数值，则数值不变。</p></li><li><p>最后将命中块的计数器清为0。</p></li></ul></li><li>访问未命中：计数值最大的块被替换。被替换的清0，其余加1.</li></ul></li><li>工作集算法：工作集指进程运行正在使用的页面集合。给定一个进程，记录其工作集。当需要进行页面替换时，选择不在工作集中的页面进行替换。</li></ul><h5 id="更新问题"><a class="markdownIt-Anchor" href="#更新问题"></a> 更新问题</h5><ul><li>file backed&amp;未被修改：直接丢弃，磁盘有相同副本</li><li>file backed&amp;修改：写回原有文职</li><li>anonymous&amp;（第一次换出|已被修改）：写入swap</li><li>anonymous&amp;非（第一次换出&amp;已被修改）：丢弃</li></ul><h4 id="工作集与驻留集管理"><a class="markdownIt-Anchor" href="#工作集与驻留集管理"></a> 工作集与驻留集管理</h4><p>工作集：当前进程正在使用的页面集合。</p><p>驻留集：每个进程驻留在内存的页面集合。（应该给每个进程分配多少页框，分配过多并发运行进程数降低；分配过少，产生抖动问题）</p><h5 id="抖动问题"><a class="markdownIt-Anchor" href="#抖动问题"></a> 抖动问题</h5><p>解决办法：</p><ul><li>局部置换策略</li><li>引入工作集算法</li><li>预留部分界面</li><li>挂起若干进程<ul><li>可挂起的进程：优先级最低、缺页进程、最后一个被激活的进程、驻留集最小的进程、最大的进程</li></ul></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051414924.png" alt="" /></p><p><strong>页面分配策略</strong></p><ul><li>固定分配策略：每个活动进程的驻留集大小在运行期间固定不变。</li><li>可变分配策略：页框数在其生命周期可变。（要求统计缺页率）</li></ul><p><strong>页面置换策略</strong></p><ul><li>局部置换策略：系统在进程自身的驻留集中判断当前是否存在空闲页框。</li><li>全局替换策略：整个进程空间判断是否存在空闲页框，允许从其他进程的驻留集中选择一个页面换出内存。</li></ul><p>可变+局部</p><h5 id="页面清除策略"><a class="markdownIt-Anchor" href="#页面清除策略"></a> 页面清除策略</h5><p>修改过的页面，如果在换出时要等待一个页面的写出和另一个页面的读入，降低处理机使用效率。</p><p><mark>页缓冲</mark></p><p>发生缺页中断时，不必首先写出置换页，而是将被选中的置换页面暂时保留在内存的缓冲区，批量写出到外存。减少IO次数。（页面缓冲算法）</p><h5 id="写时复制技术"><a class="markdownIt-Anchor" href="#写时复制技术"></a> 写时复制技术</h5><p>多个进程共享物理内存，如果想要写，就会在内存中复制一个页框写，新页框对写进程私有，其余不可见</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051416245.png" alt="" /></p><h2 id="页目录自映射"><a class="markdownIt-Anchor" href="#页目录自映射"></a> 页目录自映射</h2><p>[什么是“页表自映射”？ - 知乎 (<a href="http://zhihu.com">zhihu.com</a>)](<a href="https://zhuanlan.zhihu.com/p/452598045#:~:text=%E4%BB%80%E4%B9%88%E6%98%AF%22%E9%A1%B5%E8%A1%A8%E8%87%AA%E6%98%A0%E5%B0%84%22%EF%BC%9F">https://zhuanlan.zhihu.com/p/452598045#:~:text=什么是&quot;页表自映射&quot;？</a> 学完ICS的我们已经知道，在内存中每个普通的页都有&quot;物理地址&quot;和&quot;虚拟地址&quot;两个地址。 用户程序拿到虚拟地址后，可以把虚拟地址交给MMU，MMU先根据寄存器cr3中的物理地址找到一级页表，再根据虚拟地址的第一部分查询一级页表（也有人称为&quot;页目录%2FPage,Directory&quot; ）得到对应的二级页表（也有人称为&quot;页表%2FPage Table&quot; ）的物理地址，再根据虚拟地址的第二部分查询二级页表得到所需的页的物理地址。)</p><p>前文中一级页表和二级页表是物理页，没有规定虚拟地址。但想要通过程序（只能通过虚拟地址）查询页表。</p><p>1k*1k=1M</p><p>页表没有单独的地址空间（在物理内存中），一个页表项指向自己（首地址是页大小的整数倍）。</p><p>Q：指向页表的页表项在哪里？</p><p>A：虚拟地址右移12位，得到页号，由于一个页表项4个字节，再左移两位。（不等于右移10位，除非那两位为0！）<img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><p>高10位：一级页目录自映射还是指向自己本身。</p><p>再10位：因为指向自己，二级页表项还是那一位。</p><p>低12位：页内偏移，因为一个页表项4个字节，左移两位。</p><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><ul><li><p>存储页表的4MB地址空间中是整个4GB虚拟地址空间的一部分，即这4MB在4GB中</p></li><li><p>记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页目录</p></li><li><p>记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页表页(4MB页表中的一员)</p></li></ul><p>所以，页目录和页表页内容相同，页目录无需额外分配单独的存储空间，即有一个4KB的空间可以同时作为页目录和一个页表项，这个4KB的空间表示了整个页表的4MB地址空间与物理地址空间的映射关系。这就是自映射</p><blockquote><p>第两点的理解：页目录记录着1024个页表页的对应物理页号，而这1024个页表页逻辑连续，就相当于页目录记录了着1024*4KB = 4MB的连续地址空间到物理空间的映射关系；</p></blockquote><p>自映射：页目录中有一条PDE指向自身物理地址，这个地址就是页目录基址。</p><p><code>PT_base</code>：页表基址，<strong>也就是虚拟内存中第一个页表项的地址</strong>，<strong>应与4M对齐</strong>。PT_base=((PT_base)&gt;&gt;22)&lt;&lt;22。</p><p><code>PD_base</code>：页目录基址，<code>PD_base</code> = <code>PT_base</code> + <code>PT_base</code> &gt;&gt; 10</p><blockquote><p>解释：页目录第一个页目录项一定也是记录着第一个页表页的页表项。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>&gt;</mo><mo>&gt;</mo><mn>12</mn></mrow><annotation encoding="application/x-tex">PT_{base}&gt;&gt;12</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">2</span></span></span></span>表示第一个页表页的物理页号，一个页表项占4B空间，所以记录第一个页表页的页表项相对页表的偏移为  <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>&gt;</mo><mo>&gt;</mo><mn>12</mn><mo stretchy="false">)</mo><mo>&lt;</mo><mo>&lt;</mo><mn>2</mn><mo>=</mo><mo stretchy="false">(</mo><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>&gt;</mo><mo>&gt;</mo><mn>10</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(PT_{base}&gt;&gt;12)&lt;&lt;2 = (PT_{base}&gt;&gt;10)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mclose">)</span></span></span></span>，可得记录第一个页表页的页表项的地址为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>+</mo><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>&gt;</mo><mo>&gt;</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">PT_{base} + PT_{base}&gt;&gt;10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>，这就是页目录第一个页目录项的地址，即页目录基址。</p></blockquote><p><code>PDE_self_mapping</code>：自映射目录表项， <code>PDE_self_mapping</code> =(<code>PD_base</code>&gt;&gt;12)&lt;&lt;2+<code>PT_base</code>= <code>PT_base</code> + <code>PT_base</code> &gt;&gt; 10 + <code>PT_base</code> &gt;&gt; 20</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406042129258.png" alt="" style="zoom:80%;" /><h1 id="进程管理"><a class="markdownIt-Anchor" href="#进程管理"></a> 进程管理</h1><p>程序：静态永久的，存放在磁盘中的可执行文件。</p><p>进程：动态暂时的，程序的一次执行过程。（同步一个程序多次执行会对应多个进程。如何区分？每个进程独立的PID;一个进程也可包括多个程序）</p><ul><li>PCB：进程描述信息（PID，UID），进程控制和管理信息（CPU等使用情况，进程状态），资源分配清单，处理机相关信息记录在进程控制块PCB中。<mark>给os使用</mark></li><li>程序段：程序代码（指令序列）。<mark>给进程自身使用</mark></li><li>数据段：运行过程中产生的各种数据。 <mark>给进程自身使用</mark></li><li><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062110300.png" alt="" /></li></ul><p><mark>进程是程序的运行过程，是系统进行资源分配和调度的一个独立单位</mark></p><p>进程产生过程：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062110744.png" alt="" /></p><h2 id="进程与线程"><a class="markdownIt-Anchor" href="#进程与线程"></a> 进程与线程</h2><h3 id="进程"><a class="markdownIt-Anchor" href="#进程"></a> 进程</h3><p><strong>进程特征</strong></p><ul><li>动态性：进程是程序的一次执行过程。因创建而产生，因撤销而消亡。程序是静态实体。</li><li>并发性：多个进程实体同时存在于<mark>内存</mark>中，能在一段时间内同时运行。</li><li>独立性：进程是独立运行的基本单位。</li><li>异步性：进程之间相互制约，进程以各自独立的不可预知的速度向前推进。</li></ul><h4 id="进程执行"><a class="markdownIt-Anchor" href="#进程执行"></a> 进程执行</h4><h5 id="顺序执行"><a class="markdownIt-Anchor" href="#顺序执行"></a> 顺序执行</h5><ul><li>顺序性：程序结构所指定的次序。</li><li>封闭性：独占全部资源。<strong>执行结果只取决于进程本身，不受外界影响</strong></li><li>可再现性：初始条件相同则结果相同。</li></ul><h5 id="并发-2"><a class="markdownIt-Anchor" href="#并发-2"></a> 并发</h5><p>宏观同时发生，微观交替。</p><p>间断性：执行-暂停-执行（资源共享，可能被其他程序使用）</p><p>非封闭性：多个程序共享系统中资源。<strong>与执行速度有关</strong></p><p>不可再现性：结果依赖于执行次序。</p><ul><li>竞争：多个进程读写一个共享数据。</li><li>竞争条件：多个进程并发访问和操作统一数据且执行结果与访问的特定顺序有关。</li></ul><p>Beernstein条件：</p><p><mark>判断程序并发结果是否可再现的充分条件</mark></p><p>R(Si）：Si的读子集，其值在Si被引用的变量集合。</p><p>W(Si)：Si的写子集, 其值在Si中被改变的变量的集合。</p><p>两个进程S1和S2可并发：当且仅当下列条件同时成立：</p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo stretchy="false">(</mo><mi>S</mi><mn>1</mn><mo stretchy="false">)</mo><mo>∩</mo><mi>W</mi><mo stretchy="false">(</mo><mi>S</mi><mn>2</mn><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">R(S1)\cap W(S2)=\emptyset</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>W</mi><mo stretchy="false">(</mo><mi>S</mi><mn>1</mn><mo stretchy="false">)</mo><mo>∩</mo><mi>R</mi><mo stretchy="false">(</mo><mi>S</mi><mn>2</mn><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">W(S1)\cap R(S2)=\emptyset</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>W</mi><mo stretchy="false">(</mo><mi>S</mi><mn>1</mn><mo stretchy="false">)</mo><mo>∩</mo><mi>W</mi><mo stretchy="false">(</mo><mi>S</mi><mn>2</mn><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">W(S1)\cap W(S2)=\empty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">∅</span></span></span></span></li></ul><h5 id="并行"><a class="markdownIt-Anchor" href="#并行"></a> 并行</h5><p>微观同时发生。</p><p>前趋图：表示执行次序。</p><h4 id="进程状态与控制"><a class="markdownIt-Anchor" href="#进程状态与控制"></a> 进程状态与控制</h4><p>进程控制的主要任务是创建和撤销进程，以及实现进程的状态转换。（内核）</p><ul><li>创建进程：为进程分配资源，初始化PCB</li><li>进程撤销：中止服务，销毁PCB</li></ul><p>进程的状态：</p><ul><li>就绪状态：只要分配CPU就可执行。</li><li>执行状态：处于此状态的进程数目小于CPU的数目。</li><li>阻塞状态：由于某种时间而暂时无法执行，请求等待某个事件发生（发生后，由阻塞态转换为就绪态）。</li></ul><p><mark>运行态到阻塞态是主动行为，阻塞态到就绪态是被动的，需要相关进程协助</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062111088.png" alt="" /></p><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><p>只要就绪队列不空，CPU就总是可以调度进程运行保持繁忙，这和数目无关。除非就绪队列为空，效率降低。</p><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><h4 id="进程控制块pcb"><a class="markdownIt-Anchor" href="#进程控制块pcb"></a> 进程控制块PCB</h4><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><p>全局变量只与用户代码有关</p><blockquote><p>正文段：二进制代码，常量，全局变量</p><p>堆段：动态分配存储区（malloc）</p><p>栈段：局部变量，<strong>函数调用实参传递值</strong></p></blockquote><h5 id="原语"><a class="markdownIt-Anchor" href="#原语"></a> 原语</h5><p>内核中特殊程序，运行不能中断，必须一气呵成（信息不统一，状态标志与所在队列不统一）。</p><p>开中断指令和关中断指令配合完成（只能由内核调用）</p><p>每个进程都有一个PCB。作用：创建、撤销进程，实现进程状态转换。</p><h6 id="创建原语fork"><a class="markdownIt-Anchor" href="#创建原语fork"></a> 创建原语fork</h6><ul><li>分配进程标识号，申请PCB</li><li>分配运行所需的资源（内存，文件…)</li><li>初始化PCB</li><li>插入到就绪队列中</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062112876.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062112942.png" alt="" /></p><p><strong>父子进程共享代码段，各自拥有数据段</strong></p><p>创建新进程成功，产生两个进程，被调用一次，返回两次。</p><ul><li><code>&lt;0</code>：err。</li><li><code>=0</code>：在子进程中。</li><li><code>else</code>：在父进程中，返回子进程pid。</li></ul><h6 id="撤销原语kill"><a class="markdownIt-Anchor" href="#撤销原语kill"></a> 撤销原语kill</h6><p>释放资源，撤销子进程，重新调度。</p><ul><li>检索出PCB</li><li>终止进程执行，如正在运行将处理机资源分配给其他进程</li><li><mark>如果还有子孙进程一并终止</mark></li><li><mark>将拥有的资源归还给父进程or操作系统</mark></li><li>PCB从链表中删除</li></ul><h5 id="内容"><a class="markdownIt-Anchor" href="#内容"></a> 内容</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062117248.png" alt="" /></p><ul><li>进程标识符：唯一标识，PID。</li><li>程序和数据地址：把PCB与其程序和数据联系起来。</li><li>当前状态：相同状态组成队列。</li><li>现场保护区：陷入阻塞态时，保存CPU各种状态信息。</li><li>同步与互斥机制：实现进程间互斥、同步和通信所需的信号量。</li><li>优先级：进程的紧迫程度。</li><li>资源清单：处CPU外的资源记录，I/O设备，打开的文件列表。</li><li>链接字：队列中下一个进程PCB的首地址。</li></ul><h5 id="组织方式"><a class="markdownIt-Anchor" href="#组织方式"></a> 组织方式</h5><ul><li>线性表：不论状态将所有PCB放在内存的系统区。（适用进程数目不多）</li><li>链接：按照进程状态组成多个队列，就绪队列、阻塞队列…</li><li>索引：线性表的改进，按照状态建立就绪索引表，阻塞索引表…</li></ul><p><mark><strong>进程上下文切换 vs 陷入内核</strong></mark></p><p>进程上下文切换：</p><ul><li>调度器执行</li><li>保存进程执行断点</li><li>切换内存映射</li><li><strong>只能发生在内核态</strong></li></ul><p>陷入/退出内核：</p><ul><li>CPU状态改变</li><li>由中断、一行、trap指令（系统调用）引起</li><li>保存执行现场（寄存器，堆栈）</li><li>寄存器上下文的切换，开销远小于进程上下文切换</li></ul><h3 id="线程"><a class="markdownIt-Anchor" href="#线程"></a> 线程</h3><p>进程的不足：同一时间只能处理一个任务。</p><p>引入线程，<mark>将资源与计算费力，提高并发效率</mark>。线程是基本的CPU执行单元，程序执行流的最小单位，<mark>调度</mark>的基本单位。进程是除CPU之外的<mark>资源分配</mark>的基本单位。</p><p>资源拥有者称为进程，可执行单元称为线程。</p><ul><li>调度的基本单位。</li><li>多进程：多个程序并发执行。多线程：并发粒度更细（任务机并行）。</li><li>线程间<strong>共享系统资源</strong>。</li><li>系统开销：进程间切换进程的运行环境，开销大；线程切换开销小。</li><li>有独立的栈区，函数临时变量等。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062119731.png" alt="" /></p><h4 id="线程实现方式"><a class="markdownIt-Anchor" href="#线程实现方式"></a> 线程实现方式</h4><h5 id="用户级线程"><a class="markdownIt-Anchor" href="#用户级线程"></a> 用户级线程</h5><p>内核中仍然只有进程的概念，线程在用户空间，通过library线程库（实现线程创建、销毁、调度等功能）模拟thread。</p><ul><li>通过线程库管理线程。</li><li>线程切换：线程库应用程序完成，不需要转换到内核态。</li><li>os不能意识到用户级线程的存在。</li></ul><p>优点：用户空间即可完成线程切换，系统开销小。</p><p>缺点：其中一个线程被阻塞，整个进程都会被阻塞。并发度并不高。<strong>不能发挥多处理机的优势，内核每次分配给进程仅有一个CPU，仅有一个线程执行</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062121159.png" alt="" /></p><h5 id="内核级线程"><a class="markdownIt-Anchor" href="#内核级线程"></a> 内核级线程</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062121527.png" alt="" /></p><ul><li>内核级线程os内核可感知，用户级线程os内核不可感知。</li><li>内核级线程创建、撤销、调度线程均需要内核支持，而用户级依靠线程库。</li><li>内核级线程执行系统调用指令，只有该线程中断；用户级所属进程都被中断。</li></ul><h5 id="混合的线程实现方式"><a class="markdownIt-Anchor" href="#混合的线程实现方式"></a> 混合的线程实现方式</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062122391.png" alt="" /></p><ul><li>many-to-one Model:多个用户级线程映射到一个内核级线程。<ul><li>优点：线程管理是在用户空间进行的，因而效率比较高。</li><li>缺点：当一个线程在使用内核服务时被阻塞，那么整个进程都会被阻塞；多个线程不能并行地运行在多处理机上。</li></ul></li><li>one-to-one Model:一个用户级线程映射到一个内核级线程。<ul><li>优点：一个线程被阻塞，别的线程还可以继续执行，并发能力强。</li><li>缺点：每创建一个用户级线程都需要创建一个内核级线程与其对应，这样创建线程的开销比较大。</li></ul></li><li>many-to-many Model:n个用户级线程映射到m个内核级线程（n&gt;=m）。<mark>只有所有内核级线程都被阻塞才认为进入到了阻塞状态）</mark><ul><li><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062122528.png" alt="" /></li><li>优点：克服了多对一模型并发度不高的缺点，克服了一对一模型中一个用户进程占用多个内核级进程开销太大的缺点。</li></ul></li></ul><h4 id="posix-pthreads"><a class="markdownIt-Anchor" href="#posix-pthreads"></a> POSIX Pthreads</h4><p>用于线程创建和同步的标准（不只Unix）</p><ul><li>可在用户级和内核级实现</li><li>API规定了线程库的行为，但不限定实现方法</li></ul><h2 id="同步与互斥"><a class="markdownIt-Anchor" href="#同步与互斥"></a> 同步与互斥</h2><p>临界资源：一次仅允许一个进程访问的资源。<mark>互斥共享资源</mark></p><p>临界区：每个进程中访问临界资源的那段代码。</p><ul><li>进程互斥：&gt;=2的进程不能同时进入关于同一组共享资源的临界区。</li><li>进程同步（直接制约关系）：各进程之间能有效地共享资源和相互合作，从而使程序的执行具有可再现性。 （各并发进程有序运行）</li></ul><p><mark>区别与联系：</mark></p><p>互斥无法限制访问者对资源的访问顺序，无序访问。同步：对资源的<mark>有序访问</mark>。</p><p><strong>临界区管理条件：</strong></p><ul><li>空闲让进：临界区没有进程时，可进入。</li><li>忙则等待：任何两个进程不能同时进入。</li><li>有限等待：任何一个进程进入临界区应该在有限时间内得到满足。</li><li>让权等待：长时间不能进入临界区，应立即释放处理机，避免忙等。</li></ul><h3 id="基于忙等待的互斥方法"><a class="markdownIt-Anchor" href="#基于忙等待的互斥方法"></a> 基于忙等待的互斥方法</h3><h4 id="软件方法"><a class="markdownIt-Anchor" href="#软件方法"></a> 软件方法</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132527.png" alt="" /></p><p>p执行完while语句后，时间片用完转换到进程q，执行到occupied=true进入临界区，但转到进程p后又临界区的访问，<mark>造成空挡，不能实现互斥</mark></p><h5 id="单标志法"><a class="markdownIt-Anchor" href="#单标志法"></a> 单标志法</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132335.png" alt="" /></p><p>可以实现互斥：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132657.png" alt="" /></p><p>互相谦让，严格两进程交替轮流使用。如果某一个进程一直不使用临界资源，另一个进程也不能使用，违反空闲让进。</p><h5 id="双标志检查法"><a class="markdownIt-Anchor" href="#双标志检查法"></a> 双标志检查法</h5><p>先上锁，再检查对方是否想要临界区。（检查和上锁不能同步执行）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132217.png" alt="" /></p><p>竞争时pturn和qturn都为true，都无法进入临界区。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132274.png" alt="" /></p><p>并发运行时，就会同时访问临界区。</p><h5 id="dekker算法"><a class="markdownIt-Anchor" href="#dekker算法"></a> Dekker算法</h5><p>解决必须严格轮换的问题，通过让权。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132499.png" alt="" /></p><h5 id="peterson算法"><a class="markdownIt-Anchor" href="#peterson算法"></a> Peterson算法</h5><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*Pi进程：*/</span>                                       flag[i] = True;</span><br><span class="line"><span class="keyword">while</span>(flag[j]);</span><br><span class="line">critical section;</span><br><span class="line">flag[i] = False;</span><br><span class="line">remainder section; </span><br><span class="line"></span><br><span class="line"><span class="comment">/*Pj进程： */</span>                                         flag[j] = True;</span><br><span class="line"><span class="keyword">while</span>(flag[i]);</span><br><span class="line">critical section;</span><br><span class="line">flag[j] = False;</span><br><span class="line">remainder section;</span><br></pre></td></tr></table></figure><p>如果并发执行，<code>flag[i]</code>和<code>flag[j]</code>都为true，互相谦让饥饿，谁也没进去临界区。</p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*Pi进程：*/</span></span><br><span class="line">flag[i] = True;</span><br><span class="line">turn = j;</span><br><span class="line"><span class="keyword">while</span>(flag[j] &amp;&amp; turn == j);</span><br><span class="line">critical section;</span><br><span class="line">flag[i] = False;</span><br><span class="line">remainder section;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*Pj进程：*/</span></span><br><span class="line">flag[j] = True;</span><br><span class="line">turn = i;</span><br><span class="line"><span class="keyword">while</span>(flag[i] &amp;&amp; turn == i);</span><br><span class="line">critical section;</span><br><span class="line">flag[j] = False;</span><br><span class="line">remainder section;</span><br></pre></td></tr></table></figure><p>turn：理解为轮到谁进临界区了（按到达临界区前的先后顺序），<strong>解决饥饿问题</strong></p><p>flag：<strong>解决临界资源的互斥访问</strong></p><h4 id="硬件方法"><a class="markdownIt-Anchor" href="#硬件方法"></a> 硬件方法</h4><h5 id="中断屏蔽方法"><a class="markdownIt-Anchor" href="#中断屏蔽方法"></a> 中断屏蔽方法</h5><p>使用开/关中断指令。进入临界区之前执行关中断，退出临界区之前执行开中断。</p><p>优点：简单高效。</p><p>缺点：不适用多CPU系统。带来性能损失。只适用于<mark>内核进程</mark>，否则用户随意使用开/关中断指令很危险。</p><h5 id="test-and-set指令"><a class="markdownIt-Anchor" href="#test-and-set指令"></a> Test and Set指令</h5><p>用硬件实现的，执行过程不允许被中断（原语）。把“1”写到某个内存位置并传回其旧值。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062132925.png" alt="" /></p><p>缺点：不满足让权等待。</p><h5 id="spinlocks自旋锁"><a class="markdownIt-Anchor" href="#spinlocks自旋锁"></a> Spinlocks自旋锁</h5><p>利用test_and_set硬件原语提供互斥支持。</p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">acquire(<span class="keyword">lock</span>)&#123;</span><br><span class="line"><span class="keyword">while</span>(test_and_set(<span class="keyword">lock</span>)==<span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line">release(<span class="keyword">lock</span>)&#123;</span><br><span class="line"><span class="keyword">lock</span>=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="算法共性"><a class="markdownIt-Anchor" href="#算法共性"></a> 算法共性</h4><p>检查和上锁不能一气呵成。</p><p>不满足让权等待。</p><p>忙等待：浪费CPU时间</p><p>优先级反转：低优先级进程先进入临界区，高优先级一直忙等。</p><p>即先启动低优先级进程，加锁后调度高优先级，但判断锁已经为true，导致一直忙等。<mark>是高优先级进程于需要等待低优先级进程所占用的共享资源而被阻塞</mark></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062133760.png" alt="" style="zoom:80%;" /><p>解决方案：</p><ul><li>设置优先级上限：任何进入临界区的进程都获得最高优先级。</li><li>优先级集成：当高优先级等待一个低优先级进程持有的资源时，低优先级进程将暂时获得高优先级进程的优先级别。</li></ul><h3 id="基于信号量的同步方法"><a class="markdownIt-Anchor" href="#基于信号量的同步方法"></a> 基于信号量的同步方法</h3><p>同步中，进程经常需要等待某个条件的实现，如果使用忙等待，会浪费大量CPU时间。</p><p>解决方案：让忙等变为阻塞，原语Sleep和Wakeup。</p><h4 id="信号量"><a class="markdownIt-Anchor" href="#信号量"></a> 信号量</h4><p>semaphore（带队列的，不会忙等）</p><p>表示某种资源的数量，一个确定的二元组(s, q)，其中s是一个具有非负初值的整型变量，q是一个初始状态为空的队列. 当发出P操作时：</p><ul><li>s为正，则该值等于可立即执行的进程的数量；s &lt;= 0，那么发出P操作后的进程被阻塞，│s │是被阻塞的进程数。</li><li>q是一个初始状态为空的队列，当有进程被阻塞时就会进入此队列。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062135121.png" alt="" /></p><p><mark>只能被初始化、P(S)、V(S)操作</mark></p><h5 id="分类"><a class="markdownIt-Anchor" href="#分类"></a> 分类</h5><p>二元信号量&amp;一般信号量</p><ul><li>二元：0/1，实现互斥。</li><li>一般：初值为可用物理资源的总数，用于进程间协作同步问题。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062135159.png" alt="" /></p><p>强信号量&amp;弱信号量</p><ul><li><p>强：进程从被阻塞队列释放时采取FIFO</p></li><li><p>弱：没有规定进程从阻塞队列中移除顺序，可能导致饥饿</p></li></ul><p><strong>二元信号量机制</strong></p><p>P、V操作成对出现，先做P，进临界区，然后V，出临界区。临界区代码尽可能短，不能死循环。</p><p><strong>一般信号量</strong></p><p>数据结构包含：初始值为正的整数，初始为空的队列。</p><p>三个原子操作：</p><ul><li>初始化</li><li>P：使信号量减1。若值为负（资源分完了），则执行semWait的进程被阻塞</li><li>V：使信号量加1。若值小于或等于零（仍有等待该资源的被阻塞），则被semWait操作阻塞的进程被解除阻塞</li></ul><h5 id="作用"><a class="markdownIt-Anchor" href="#作用"></a> 作用</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062137306.png" alt="" /></p><p>PV操作优点：简单，表达能力强（可解决任何同步互斥问题）</p><p>缺点：不够安全，使用不当会出现死锁，遇到复杂同步互斥问题时实现复杂</p><h6 id="实现进程同步"><a class="markdownIt-Anchor" href="#实现进程同步"></a> 实现进程同步</h6><p>P1必须要在P2后执行，可以先初始化信号量为0（前操作之后执行V，后操作之前执行P）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062137361.png" alt="" /></p><h6 id="实现前驱关系"><a class="markdownIt-Anchor" href="#实现前驱关系"></a> 实现前驱关系</h6><p>eg：<mark>后驱有两个，设置不同的锁！！！（一次V只能释放一个）</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062137936.png" alt="" /></p><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><h6 id="实现进程互斥"><a class="markdownIt-Anchor" href="#实现进程互斥"></a> 实现进程互斥</h6><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">semaphore S=<span class="number">1</span>;</span><br><span class="line">P1()&#123;</span><br><span class="line">    P(S);</span><br><span class="line">    P1临界区;</span><br><span class="line">    V(S);</span><br><span class="line">&#125;</span><br><span class="line">P2()&#123;</span><br><span class="line">    P(S);</span><br><span class="line">    P2临界区;</span><br><span class="line">    V(S);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="信号量集"><a class="markdownIt-Anchor" href="#信号量集"></a> 信号量集</h4><p>控制同时需要多个资源的互斥访问。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mi>P</mi><mo stretchy="false">(</mo><msub><mi>S</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>t</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>d</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">SP(S_1,t_1,d_1,...,)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mclose">)</span></span></span></span>。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub><mo>≥</mo><msub><mi>t</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i\geq t_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76508em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，否则资源量低，不予分配；占用值为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>d</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">d_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。信号量增减 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>d</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">d_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><blockquote><p>对于信号量集错误的是：（多选）<br />A. SP(S, d, e)表示每次申请d个资源，当资源数少于e个时，便不予分配</p><p>B. SP(S, 0, 1)表示互斥信号量</p><p>C. SP(S, 1, 0)当S=0时禁止任何进程进入临界区</p></blockquote><p>答：A、B</p><p>SP(S, d, e)应当表示每次申请e个资源，但当资源数少于d个时便不予分配，A错误。表示互斥信号量的方法是SP(S, 1, 1)，每次申请1个资源，当资源数少于1个时阻塞，B错误。</p><h3 id="基于管程的同步与互斥"><a class="markdownIt-Anchor" href="#基于管程的同步与互斥"></a> 基于管程的同步与互斥</h3><p>管程：名称，局部与管程内存的共享数据结构的说明，对该数据结构进程操作的一组互斥执行的过程，对局部与管程内部的共享数据设置初始值的语句。</p><p><strong>依赖于编译器，适用于单机环境</strong></p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">monitor demo&#123;</span><br><span class="line">共享数据结构 S;</span><br><span class="line">    <span class="keyword">init</span>()&#123;<span class="comment">//初始化</span></span><br><span class="line">        S=<span class="number">5</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    take_away()&#123;<span class="comment">//申请一个资源</span></span><br><span class="line">        <span class="keyword">if</span>(s&lt;=<span class="number">0</span>)x.wait();</span><br><span class="line">        S--;</span><br><span class="line">    &#125;</span><br><span class="line">    give_back()&#123;<span class="comment">//归还一个资源</span></span><br><span class="line">        S++;</span><br><span class="line">        <span class="keyword">if</span>(有进程在等待)x.signal();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>解决的问题：</p><p>1.互斥：只有一个进程能进入。</p><p>2.同步：wait和signal，使一个进程&amp;线程当条件满足/不满足的时候在条件变量上唤醒/等待。</p><p>3.条件变量：区分等待的不同原因，每个条件变量保存一个等待队列。</p><blockquote><p><code>x.wait</code>：当x对应的条件不满足时，调用使该进程进入x条件的等待队列，并释放管程。</p><p><code>x.signal</code>：x对应的条件发生变化，调用它唤醒一个因x条件而阻塞的进程。</p></blockquote><p><strong>与信号量的区别：</strong></p><ul><li>条件变量的值不可增减（管程中用共享数据结构记录剩余资源数），信号量有值。</li><li>wait一定会阻塞当前进程，P操作只有当信号量&lt;0才会阻塞。</li><li>如果没有等待的进程，signal将丢失；而V操作增加了信号量的值，不会丢失。</li><li>访问条件变量必须拥有管程的锁。</li></ul><h4 id="hoare管程"><a class="markdownIt-Anchor" href="#hoare管程"></a> Hoare管程</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062140488.png" alt="" /></p><p>入口等待队列：管程互斥进入。</p><p>紧急等待队列：被其他进程唤醒但由于互斥无法进入管程，优先级高于入口等待队列。</p><p>条件变量：每个表示一种等待原因，每个原因对应一个队列。</p><p>同步原语wait和signal：针对条件变量x，wait将自己阻塞在x队列中；signal将队列中的一个进程唤醒。</p><p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /></p><h5 id="信号量定义"><a class="markdownIt-Anchor" href="#信号量定义"></a> 信号量定义</h5><ul><li>mutex=1：互斥进入管程。进入管程执行<code>P(mutex)</code>，退出管程执行<code>V(mutex)</code>。执行wait由于一定会阻塞该进程，也要<code>V(mutex)</code>。</li><li>next=0：发出signal的进程用P挂起自己。进程退出管程前，检查是否有别的进程在next等待，如有用V唤醒。next-count是等待进程数。</li><li>x-sem=0：申请资源得不到满足执行P挂起。用x-count记录等待资源的进程数。执行signal时，V。</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062140737.png" alt="" style="zoom:80%;" /><h3 id="进程通信的主要方法"><a class="markdownIt-Anchor" href="#进程通信的主要方法"></a> 进程通信的主要方法</h3><p>低级通信：只能传递状态和整数值，包括信号量和管程机制。（传送信息量小，编程复杂）</p><p>高级通信：适用于分布式系统。包括管道、共享内存、消息系统。</p><h4 id="管道"><a class="markdownIt-Anchor" href="#管道"></a> 管道</h4><p>（相当于缓冲区，用于连接一个读进程和一个写进程<mark>读写可同时进行，写满阻塞写，缓冲区为空阻塞读</mark>）</p><p>管道是<strong>半双工</strong>的，<strong>数据只能向一个方向流动</strong>。双方通信需要建立两个管道。</p><ul><li><p>无名管道：只能用于父子进程或者兄弟进程之间（亲缘关系）；单独构成一种独立的文件系统，只存在于内存；一个进程向管道中写的内容（添加在缓冲区末尾）被管道另一端的进程读出。</p></li><li><p>有名管道FIFO：不再限制一定有亲缘关系；FIFO不同于无名管道之处在于它提供一个路径名与之关联，以FIFO的文件形式存在于文件系统中。</p></li></ul><h4 id="消息传递"><a class="markdownIt-Anchor" href="#消息传递"></a> 消息传递</h4><p><strong>管程：过度依赖编译器；适用于单机环境</strong></p><p>原语：<code>send(destination,&amp;message)</code>和<code>receive(source,&amp;message)</code>。</p><p><mark>对用户透明，广泛使用</mark></p><h4 id="共享内存"><a class="markdownIt-Anchor" href="#共享内存"></a> 共享内存</h4><p>最有用，最快的IPC形式（避免开销巨大的缓冲复制）</p><ul><li>同一块物理内存被映射到进程A、B各自的进程地址空间。当多个进程共享同一块内存区域，由于共享内存可以同时读但不能同时写，则需要同步机制约束（互斥锁和信号量都可以）。</li><li>共享内存可以同时读，不能同时写，需要同步机制约束</li><li><mark>通信效率高，进程可以直接读写内存</mark></li></ul><h3 id="经典进程同步与互斥问题"><a class="markdownIt-Anchor" href="#经典进程同步与互斥问题"></a> 经典进程同步与互斥问题</h3><blockquote><p>解题：</p><ul><li>分析同步互斥关系。</li><li>同步即先V后P，互斥全部加上PV。</li><li>互斥信号量初始值为1，同步要看资源的多少。</li></ul></blockquote><h4 id="生产者-消费者问题"><a class="markdownIt-Anchor" href="#生产者-消费者问题"></a> 生产者-消费者问题</h4><p>生产者，消费者，固定大小的缓冲区。</p><ul><li>同步关系：缓冲区没满-&gt;生产者生产，缓冲区不空-&gt;消费者取数据</li><li>互斥关系：各进程互斥访问缓冲区。</li></ul><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//互斥进入缓冲区</span></span><br><span class="line">semaphore empty=n;<span class="comment">//缓冲区空块数</span></span><br><span class="line">semaphore full=<span class="number">0</span>;<span class="comment">//缓冲区满块数</span></span><br><span class="line">producer:&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(empty);</span><br><span class="line">        P(mutex);</span><br><span class="line">        put;</span><br><span class="line">        V(mutex);</span><br><span class="line">        V(full);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">consumer:&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(full);</span><br><span class="line">        P(mutex);</span><br><span class="line">        <span class="keyword">get</span>;</span><br><span class="line">        V(mutex);</span><br><span class="line">        V(empty);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果mutex与empty互换，会被阻塞。<mark>互斥锁尽可能紧靠临界区</mark></p><blockquote><p>例题：</p><p>桌子有一个盘子，只能放一个水果，爸爸只放apple，妈妈只放orange，儿子只吃orange，女儿只吃apple。</p><ul><li>互斥：爸爸妈妈放水果</li><li>同步：爸爸放-女儿拿，妈妈放-儿子拿</li></ul><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">semaphore plate=<span class="number">1</span>;</span><br><span class="line">semaphore apple=<span class="number">0</span>,orange=<span class="number">0</span>;</span><br><span class="line">dad()&#123;</span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">P(plate);</span><br><span class="line">        放苹果;</span><br><span class="line">        V(apple);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">mom()&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(plate);</span><br><span class="line">        放橘子;</span><br><span class="line">        V(orange);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">son()&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(orange);</span><br><span class="line">        拿橘子;</span><br><span class="line">        V(plate);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">daughter()&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(apple);</span><br><span class="line">        拿苹果;</span><br><span class="line">        V(plate);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></blockquote><h4 id="读者-写者问题"><a class="markdownIt-Anchor" href="#读者-写者问题"></a> 读者-写者问题</h4><p>对共享资源的读写操作，任一时刻“写者”只允许一个，“读者”允许多个。读-写互斥，写-写互斥，读-读允许。</p><ul><li>同步关系：</li><li>互斥关系：写与写，写与读</li></ul><h5 id="读优先"><a class="markdownIt-Anchor" href="#读优先"></a> 读优先</h5><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">semaphore rw=<span class="number">1</span>;<span class="comment">//互斥访问</span></span><br><span class="line"><span class="built_in">int</span> count=<span class="number">0</span>;<span class="comment">//几个读进程</span></span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//对count互斥访问</span></span><br><span class="line">main()&#123;</span><br><span class="line">    cobegin&#123;</span><br><span class="line">       write:&#123;</span><br><span class="line">           <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">               P(rw);</span><br><span class="line">               write;</span><br><span class="line">               V(rw);</span><br><span class="line">           &#125;</span><br><span class="line">       &#125; </span><br><span class="line">       read:&#123;</span><br><span class="line">           <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">               P(mutex);</span><br><span class="line">               <span class="keyword">if</span>(count==<span class="number">0</span>)</span><br><span class="line">                   P(rw);</span><br><span class="line">               count++;</span><br><span class="line">               V(mutex);</span><br><span class="line">               read;</span><br><span class="line">               P(mutex);</span><br><span class="line">               count--;</span><br><span class="line">               <span class="keyword">if</span>(count==<span class="number">0</span>)</span><br><span class="line">                   V(rw);</span><br><span class="line">               V(mutex);</span><br><span class="line">           &#125;</span><br><span class="line">       &#125;</span><br><span class="line">    &#125;coend</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>写与读互斥，两个都加上rw的PV操作。</p><p>读与读不互斥：增加count值记录当前有几个读，只有第一次进入读的时候才上锁，最后一个解锁。</p><p>读与读同时访问count：给count上锁</p><h5 id="读写公平"><a class="markdownIt-Anchor" href="#读写公平"></a> 读写公平</h5><p>❓如果读进程一直读，写进程可能会被饿死？</p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">semaphore rw=<span class="number">1</span>;<span class="comment">//互斥访问</span></span><br><span class="line">semaphore r=<span class="number">1</span>;<span class="comment">//读写公平</span></span><br><span class="line"><span class="built_in">int</span> count=<span class="number">0</span>;<span class="comment">//几个读进程</span></span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//对count互斥访问</span></span><br><span class="line">main()&#123;</span><br><span class="line">    cobegin&#123;</span><br><span class="line">       write:&#123;</span><br><span class="line">           <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">               P(r);</span><br><span class="line">               P(rw);</span><br><span class="line">               write;</span><br><span class="line">               V(rw);</span><br><span class="line">               V(r);</span><br><span class="line">           &#125;</span><br><span class="line">       &#125; </span><br><span class="line">       read:&#123;</span><br><span class="line">           <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">               P(r);</span><br><span class="line">               P(mutex);</span><br><span class="line">               <span class="keyword">if</span>(count==<span class="number">0</span>)</span><br><span class="line">                   P(rw);</span><br><span class="line">               count++;</span><br><span class="line">               V(mutex);</span><br><span class="line">               V(r);</span><br><span class="line">               read;</span><br><span class="line">               P(mutex);</span><br><span class="line">               count--;</span><br><span class="line">               <span class="keyword">if</span>(count==<span class="number">0</span>)</span><br><span class="line">                   V(rw);</span><br><span class="line">               V(mutex);</span><br><span class="line">           &#125;</span><br><span class="line">       &#125;</span><br><span class="line">    &#125;coend</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>增加w用于实现读写公平。</p><p>读者1-&gt;写者1-&gt;读者2，就会读者2不会继续进入，会被阻塞。</p><h5 id="写优先"><a class="markdownIt-Anchor" href="#写优先"></a> 写优先</h5><p>要想实现写优先，那么比写先来的读者不能在r上排队。</p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> readcount=<span class="number">0</span>;<span class="comment">//记录当前有多少个读进程在访问文件</span></span><br><span class="line"><span class="built_in">int</span> writecount=<span class="number">0</span>;<span class="comment">//当writecount=0,唤醒读者</span></span><br><span class="line">semaphore mutex1=<span class="number">1</span>;<span class="comment">//用于保证对readcount变量的互斥访问</span></span><br><span class="line">semaphore mutex2=<span class="number">1</span>;<span class="comment">//用于保证对writecount变量的互斥访问</span></span><br><span class="line"></span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//用于保证写者之间的互斥访问，其他读者要进入rmutex之前需要在mutex上排队</span></span><br><span class="line">semaphore rmutex=<span class="number">1</span>;<span class="comment">//当有新写者来时，停止所有的读进程。</span></span><br><span class="line">semaphore wmutex=<span class="number">1</span>;<span class="comment">//实现对写操作地互斥访问</span></span><br><span class="line"></span><br><span class="line">reader()&#123;</span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">P(mutex);<span class="comment">//实现写者优先访问，禁止读者在rmutex排队,保证一次只有一个读者进程访问rmutex</span></span><br><span class="line">P(rmutex);<span class="comment">//读者进程加锁</span></span><br><span class="line">P(mutex1);<span class="comment">//互斥修改readcount变量</span></span><br><span class="line">readcount++;</span><br><span class="line"><span class="keyword">if</span>(readcount==<span class="number">1</span>)</span><br><span class="line">P(wmutex);<span class="comment">//当有读者进程执行读操作时，对写者进程加锁</span></span><br><span class="line">V(mutex1);</span><br><span class="line">V(rmutex);<span class="comment">//读者进程解锁</span></span><br><span class="line">V(mutex);</span><br><span class="line">读文件...</span><br><span class="line">P(mutex1);<span class="comment">//互斥修改readcount变量</span></span><br><span class="line">readcount--;</span><br><span class="line"><span class="keyword">if</span>(readcount==<span class="number">0</span>)</span><br><span class="line">V(wmutex);<span class="comment">//当读者数量为0,解锁写者进程，允许写者进程执行写操作</span></span><br><span class="line">V(mutex1);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">writer()&#123;</span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">P(mutex2);<span class="comment">//各写者进程互斥访问writecount</span></span><br><span class="line">writecount++;<span class="comment">//写进程数量+1</span></span><br><span class="line"><span class="keyword">if</span>(writecount==<span class="number">1</span>)</span><br><span class="line">P(rmutex);<span class="comment">//有写进程时，对读进程加锁</span></span><br><span class="line">V(mutex2);</span><br><span class="line">P(wmutex);<span class="comment">//写之前加锁，保证每次只有一个写者可以进行写操作</span></span><br><span class="line">写文件...</span><br><span class="line">V(wmutex);</span><br><span class="line">P(mutex2);</span><br><span class="line">writecount--;<span class="comment">//每当有一个写进程完成写操作，写者数量-1</span></span><br><span class="line"><span class="keyword">if</span>(writecount==<span class="number">0</span>)</span><br><span class="line">V(rmutex);<span class="comment">//若没有写进程正在执行，解锁读者进程</span></span><br><span class="line">V(mutex2);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="哲学家进餐问题"><a class="markdownIt-Anchor" href="#哲学家进餐问题"></a> 哲学家进餐问题</h4><p>哲学家思考or进餐，如果进餐，每个哲学家的左边和右边各有一只筷子。需要持有两个临界资源，如果避免造成死锁。</p><p>最多只能四个人拿筷子or奇数号拿左边，偶数拿右边or只有两边都可以使用时再抓起筷子。</p><blockquote><ul><li>互斥关系：哲学家与左右邻居对其中间筷子的访问。</li><li>注意死锁现象</li><li>定义信号量设置。chopsticks[5]={1,1,1,1,1}。左边筷子为i，右边的(i+1)%5.</li></ul></blockquote><h5 id="最多只允许四个哲学家同时尝试进餐破除资源互斥"><a class="markdownIt-Anchor" href="#最多只允许四个哲学家同时尝试进餐破除资源互斥"></a> 最多只允许四个哲学家同时（尝试）进餐——破除资源互斥</h5><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">semaphore chopsticks[<span class="number">5</span>]=&#123;<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>&#125;;</span><br><span class="line">semaphore count=<span class="number">4</span>;<span class="comment">//最多允许4个人</span></span><br><span class="line">Pi()&#123;</span><br><span class="line">    P(count);</span><br><span class="line">    P(chopsticks[i]);</span><br><span class="line">    P(chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]);</span><br><span class="line">    吃饭;</span><br><span class="line">    V(chopsticks[i]);</span><br><span class="line">    V[chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]];</span><br><span class="line">    V(count);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="同时拿起两根筷子否则不拿起破除保持等待"><a class="markdownIt-Anchor" href="#同时拿起两根筷子否则不拿起破除保持等待"></a> 同时拿起两根筷子，否则不拿起——破除保持等待</h5><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">semaphore chopsticks[<span class="number">5</span>]=&#123;<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>&#125;;</span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//互斥的取筷子</span></span><br><span class="line">Pi()&#123;</span><br><span class="line">    P(mutex);</span><br><span class="line">    P(chopsticks[i]);</span><br><span class="line">    P(chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]);</span><br><span class="line">    V(mutex);</span><br><span class="line">    吃饭;</span><br><span class="line">    V(chopsticks[i]);</span><br><span class="line">    V[chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="奇数号拿左边偶数拿右边"><a class="markdownIt-Anchor" href="#奇数号拿左边偶数拿右边"></a> 奇数号拿左边，偶数拿右边</h5><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">semaphore chopsticks[<span class="number">5</span>]=&#123;<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>&#125;;</span><br><span class="line">philosopher(<span class="built_in">int</span> i)&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        <span class="keyword">if</span>(i%<span class="number">2</span>!=<span class="number">0</span>)&#123;</span><br><span class="line">            P(chopsticks[i]);</span><br><span class="line">            P(chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]);</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            P(chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]);</span><br><span class="line">            P(chopsticks[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        吃饭;</span><br><span class="line">        V(chopsticks[i]);</span><br><span class="line">    V[chopsticks[(i+<span class="number">1</span>)%<span class="number">5</span>]];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="睡觉的理发师"><a class="markdownIt-Anchor" href="#睡觉的理发师"></a> 睡觉的理发师</h4><p>有一位理发师，一把理发椅，n把等候用的椅子。</p><p>与生产者类似，但生产者可以生产无数个，但顾客没有空座就走了</p><ul><li>互斥：排队的顾客数</li><li>同步：顾客唤醒理发师，理发师唤醒下一位等待顾客</li></ul><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> waiting=<span class="number">0</span>;<span class="comment">//等待的顾客数（不包括正在理发）</span></span><br><span class="line"><span class="built_in">int</span> chairs=n;</span><br><span class="line">semaphore customers=<span class="number">0</span>;<span class="comment">//顾客数</span></span><br><span class="line">semaphore barber=<span class="number">0</span>;<span class="comment">//空闲的理发师数</span></span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//互斥访问waiting</span></span><br><span class="line">barber:&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line">        P(customers);</span><br><span class="line">    P(mutex);</span><br><span class="line">    waiting--;</span><br><span class="line">    V(mutex);</span><br><span class="line">    V(barber);</span><br><span class="line">    cut_hair();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">customer:&#123;</span><br><span class="line">    P(mutex);</span><br><span class="line">    <span class="keyword">if</span>(waiting&lt;chairs)&#123;</span><br><span class="line">        waiting++;</span><br><span class="line">        V(mutex);</span><br><span class="line">    V(customers);</span><br><span class="line">    P(barbers);<span class="comment">//理发师忙，顾客坐下等待</span></span><br><span class="line">    get_haircut();</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        V(mutex);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="调度"><a class="markdownIt-Anchor" href="#调度"></a> 调度</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062157494.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062157950.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062157841.png" alt="" /></p><p>CPU调度：控制、协调多个进程对CPU的竞争。</p><blockquote><ul><li>进程调度算法</li><li>进程调度的时机</li><li>CPU切换过程（进程的上下文切换）</li></ul></blockquote><h3 id="cpu三级调度"><a class="markdownIt-Anchor" href="#cpu三级调度"></a> CPU三级调度</h3><ul><li><p>高级调度（作业）：（用户角度）一次提交若干作业，对每个作业进行调度。<strong>从外存后备队列挑选一个使其获得竞争CPU的权利</strong></p></li><li><p>中级调度（内外存交换）：指令和数据必须在内存里才能被CPU直接访问。（存储器资源管理角度）进程的部分或全部换出到外存，当前所需部分换入到内存。<strong>将内存中暂时不能运行的调出到外存等待（挂起态），具备条件后再调入内存（就绪态）</strong></p></li><li><p>低级调度（进程&amp;线程调度）：（CPU资源管理角度）执行单位ms。<strong>高效率</strong></p></li></ul><p>调度频率：低级&gt;中级&gt;高级</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051627287.png" alt="" /></p><h3 id="调度准则"><a class="markdownIt-Anchor" href="#调度准则"></a> 调度准则</h3><blockquote><p>不同角度判断处理机调度算法的性能</p></blockquote><ul><li><p><strong>周转时间</strong>：作业从提交到完成经理时间=收容队列等待+CPU执行+就绪、阻塞等待+结果输出等待（批处理系统）</p></li><li><p><strong>带权平均周转时间</strong>：周转时间/实际服务时间</p></li><li><p>响应时间：用户输入请求到系统给出首次响应（分时系统）</p></li><li><p>截止时间：开始截止时间和完成截止时间（实时系统，与周转时间类似）</p></li><li><p>优先级：使关键任务达到更好的指标</p></li><li><p>公平性：不因作业或进程本身的特性使上述指标过分恶化（eg：长作业等待时间极长）</p></li><li><p><strong>吞吐量</strong>：单位时间内完成作业数</p><blockquote><p>平均周转时间不一定是吞吐量的倒数。并发执行作业时间可重叠⚠️</p></blockquote></li><li><p>处理机利用率</p></li><li><p>各种资源的均衡利用：CPU繁忙的和作业和I/O繁忙（次数多，时间短）的作业搭配</p></li></ul><p><mark>易于实现，执行/开销比小</mark></p><h3 id="设计调度算法考虑问题"><a class="markdownIt-Anchor" href="#设计调度算法考虑问题"></a> 设计调度算法考虑问题</h3><h5 id="进程优先级数"><a class="markdownIt-Anchor" href="#进程优先级数"></a> 进程优先级（数）</h5><p>优先级：进程重要性和紧迫性。优先数：数值反应优先级</p><p>静态优先级&amp;动态</p><h5 id="进程就绪队列组织"><a class="markdownIt-Anchor" href="#进程就绪队列组织"></a> 进程就绪队列组织</h5><p>按优先级：优先级较高先执行</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204202.png" alt="" /></p><p>所有进程创建都进入第一级就绪队列，随着进程运行，降低某些进程的优先级，进入之后级的队列。（比如时间片用完）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204115.png" alt="" /></p><h5 id="占用cpu方式"><a class="markdownIt-Anchor" href="#占用cpu方式"></a> 占用CPU方式</h5><ul><li>不可抢占式：一旦分配进程一直占用处理机，除非进入阻塞&amp;时间片用完</li><li>抢占式：一旦有优先级高于当前进程优先级，立即进程调度</li></ul><h5 id="进程分类"><a class="markdownIt-Anchor" href="#进程分类"></a> 进程分类</h5><ul><li><p>I/O密集型&amp;CPU密集型</p></li><li><p>批处理进程（无需用户交互，无需马上响应）&amp;交互式进程（交互平凡，响应时间快）&amp;实时进程（实时要求，不能被低优先级阻塞，响应时间短）</p></li></ul><h5 id="时间片"><a class="markdownIt-Anchor" href="#时间片"></a> 时间片</h5><p>分配给占用CPU的长度，确定允许该进程运行的时间长度</p><h3 id="批处理系统的调度算法"><a class="markdownIt-Anchor" href="#批处理系统的调度算法"></a> 批处理系统的调度算法</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051630774.png" alt="" /></p><h4 id="先来先服务fcfs"><a class="markdownIt-Anchor" href="#先来先服务fcfs"></a> 先来先服务FCFS</h4><p>按照作业提交或进程变为就绪状态的先后次序，非抢占式，I/O完成并不立即恢复执行。</p><p>利于长作业，利于CPU繁忙的作业</p><blockquote><p>Q：有利于CPU繁忙的作业，不利于I/O繁忙的作业。why？</p><p>A：FCFS在CPU繁忙的作业到达时，可以立即执行，一直占用CPU资源直到完成。当I/O繁忙的作业，每运行一点点就因为I/O而被阻塞，返回就绪状态后又返回到了队列的队尾，I/O繁忙型作业响应时间长。</p><p><mark><strong>延伸</strong></mark>：I/O型进程比计算型优先级高，I/O设备可以和CPU并行工作，优先的话可以使其今早投入工作，以提升吞吐量。</p></blockquote><h4 id="短作业优先sjf"><a class="markdownIt-Anchor" href="#短作业优先sjf"></a> 短作业优先SJF</h4><p>对FCFS改进，减少平均周转时间，非抢占</p><p>优：缩短作业等待时间，提升吞吐量</p><p>缺：不利于长作业，不划分优先级，难以估计作业的执行时间</p><h4 id="最短剩余时间优先srtn"><a class="markdownIt-Anchor" href="#最短剩余时间优先srtn"></a> 最短剩余时间优先SRTN</h4><p>SJF改进为抢占式</p><p>缺：长作业饥饿</p><h4 id="最高响应时间比优先hrrn"><a class="markdownIt-Anchor" href="#最高响应时间比优先hrrn"></a> 最高响应时间比优先HRRN</h4><p>FCFS和SJF折中，非抢占，调度时先计算每个作业响应比RP，选择值最大的。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mi>P</mi><mo>=</mo><mo stretchy="false">(</mo><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">已</mi><mi mathvariant="normal">等</mi><mi mathvariant="normal">待</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>+</mo><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">服</mi><mi mathvariant="normal">务</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">服</mi><mi mathvariant="normal">务</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">等</mi><mi mathvariant="normal">待</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mi mathvariant="normal">/</mi><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">服</mi><mi mathvariant="normal">务</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi></mrow><annotation encoding="application/x-tex">RP=(作业已等待时间+作业服务时间)/作业服务时间=1+作业等待时间/作业服务时间</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">已</span><span class="mord cjk_fallback">等</span><span class="mord cjk_fallback">待</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">服</span><span class="mord cjk_fallback">务</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mclose">)</span><span class="mord">/</span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">服</span><span class="mord cjk_fallback">务</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">等</span><span class="mord cjk_fallback">待</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mord">/</span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">服</span><span class="mord cjk_fallback">务</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span></span></span></span></span></p><p>优：短作业容易获得较高响应比，长作业等待时间长后也可以得到高响应比。</p><p>缺：计算RP时间开销。</p><h3 id="交互式系统的调度算法"><a class="markdownIt-Anchor" href="#交互式系统的调度算法"></a> 交互式系统的调度算法</h3><h4 id="时间片轮转rr"><a class="markdownIt-Anchor" href="#时间片轮转rr"></a> 时间片轮转RR</h4><p><mark>一定是可抢占</mark></p><p>提高进程并发性和响应时间特性，从而提高资源利用率。</p><blockquote><p>按FCFS排成队列，执行一个时间片后暂停，送到就绪队列末尾，通过上下文切换到队首进程。</p></blockquote><ul><li>时间片过长：退化为FCFS，进程在一个时间片内部即可执行完，响应时间长。</li><li>过短：上下文切换次数增加，响应时间长。</li></ul><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>T</mi><mo stretchy="false">(</mo><mi mathvariant="normal">响</mi><mi mathvariant="normal">应</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mo stretchy="false">)</mo><mo>=</mo><mi>N</mi><mo stretchy="false">(</mo><mi mathvariant="normal">进</mi><mi mathvariant="normal">程</mi><mi mathvariant="normal">数</mi><mi mathvariant="normal">目</mi><mo stretchy="false">)</mo><mo>∗</mo><mi>q</mi><mo stretchy="false">(</mo><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mi mathvariant="normal">片</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T(响应时间)=N(进程数目)*q(时间片)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mopen">(</span><span class="mord cjk_fallback">响</span><span class="mord cjk_fallback">应</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord cjk_fallback">进</span><span class="mord cjk_fallback">程</span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">目</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mord cjk_fallback">片</span><span class="mclose">)</span></span></span></span></span></p><p>就绪进程数目越多，时间片越小。通常用户输入在一个时间片内处理完。</p><h4 id="优先级算法ps"><a class="markdownIt-Anchor" href="#优先级算法ps"></a> 优先级算法PS</h4><p>平衡各进程对响应时间的要求。</p><p>抢占&amp;非抢占：</p><ul><li>抢占：出现更高优先级的进程进入就绪队列，立即调度</li><li>非抢占：继续执行</li></ul><p>静态&amp;动态：</p><ul><li><p>静态：依据进程类型，对资源需求，用户要求</p></li><li><p>动态：等待时间长调高优先级，每执行一个时间片降低优先级。</p></li></ul><h4 id="多级队列mq"><a class="markdownIt-Anchor" href="#多级队列mq"></a> 多级队列MQ</h4><blockquote><p>引入多个就绪队列，区别对待各列（进程兴致或类型不同），每个作业固定归入一个队列。</p></blockquote><h4 id="多级反馈队列mfq"><a class="markdownIt-Anchor" href="#多级反馈队列mfq"></a> 多级反馈队列MFQ</h4><p>时间片轮转&amp;优先级算法</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204732.png" alt="" /></p><h5 id="线程调度一个时间片内的调度"><a class="markdownIt-Anchor" href="#线程调度一个时间片内的调度"></a> 线程调度：一个时间片内的调度</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204564.png" alt="" /></p><h5 id="优先级倒置"><a class="markdownIt-Anchor" href="#优先级倒置"></a> 优先级倒置</h5><p>低优先级的进程占用临界资源且被阻塞，且低优先级的很长时间得不到CPU进而间接导致同样需要使用临界资源的高优先级进程被阻塞。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204976.png" alt="" /></p><p>解决方法：优先级置顶。</p><blockquote><p>进入临界区，当前执行进程具有最高优先级</p></blockquote><p>解决方法：优先级进程。</p><blockquote><p>高优先级进入临界区，发现已经有低优先级进程，则其继承高优先级。</p></blockquote><h3 id="实时系统的调度算法"><a class="markdownIt-Anchor" href="#实时系统的调度算法"></a> 实时系统的调度算法</h3><p>时间起主导作用，硬实时（对时间必须响应）&amp;软实时（偶尔可不满足）。<strong>进程行为可预测</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062204692.png" alt="" /></p><h4 id="静态表调度"><a class="markdownIt-Anchor" href="#静态表调度"></a> 静态表调度</h4><blockquote><p>对所有周期性任务分析预测，确定固定的调度方案。</p></blockquote><p>优：无计算，开销小。</p><p>缺：无灵活性，适用固定场景。</p><h4 id="单调速率调度rms"><a class="markdownIt-Anchor" href="#单调速率调度rms"></a> 单调速率调度RMS</h4><blockquote><p>周期越小，优先级越高。</p></blockquote><p>任务集可调度：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mi>C</mi><mi>i</mi></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mo>≤</mo><mi>n</mi><mo stretchy="false">(</mo><mroot><mn>2</mn><mi>n</mi></mroot><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>≈</mo><mn>0.69</mn></mrow><annotation encoding="application/x-tex">\sum^{n}_{i=1}\frac{C_i}{T_i}\leq n(\sqrt[n]{2}-1)\approx0.69</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.206095em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mopen">(</span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738594em;"><span style="top:-3.023314em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.956095em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">2</span></span></span><span style="top:-2.916095em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.08390500000000001em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">9</span></span></span></span></span></p><h4 id="最早时间优先算法edf"><a class="markdownIt-Anchor" href="#最早时间优先算法edf"></a> 最早时间优先算法EDF</h4><blockquote><p>绝对截止日期时间最早，优先级越高</p></blockquote><p>任务集可调度：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mi>C</mi><mi>i</mi></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mo>≤</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\sum^n_{i=1}\frac{C_i}{T_i}\leq1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span></span></p><h4 id="最低松弛度优先算法llf"><a class="markdownIt-Anchor" href="#最低松弛度优先算法llf"></a> 最低松弛度优先算法LLF</h4><blockquote><p>根据任务紧急程度确定优先级。</p><p>调度时机（抢占）：有进程执行完&amp;进程laxity=0（抢占）</p></blockquote><p>松弛度=任务截止时间-本身剩余运行时间-当前时间</p><p>任务集可调度：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mi>C</mi><mi>i</mi></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mo>≤</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\sum^n_{i=1}\frac{C_i}{T_i}\leq1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span></span></p><h3 id="多处理机调度"><a class="markdownIt-Anchor" href="#多处理机调度"></a> 多处理机调度</h3><p>注重整体效率，多样调度算法，调度范围线程</p><h4 id="非对称式amp"><a class="markdownIt-Anchor" href="#非对称式amp"></a> 非对称式AMP</h4><p>各个处理器的地位不同，有固定分工。</p><h4 id="对称式smp"><a class="markdownIt-Anchor" href="#对称式smp"></a> 对称式SMP</h4><p>地位相同。</p><h5 id="静态控制"><a class="markdownIt-Anchor" href="#静态控制"></a> 静态控制</h5><p>每个CPU设立一个就绪队列，进程从执行到完成，都在同一个CPU上。</p><ul><li>优：调度算法开销小</li><li>缺：容易出现忙闲不均</li></ul><h5 id="动态控制"><a class="markdownIt-Anchor" href="#动态控制"></a> 动态控制</h5><p>各个CPU采用公共就绪队列，选择队首分配给空闲CPU</p><ul><li>自调度：各个CPU采用公共就绪队列，每个处理机都可以从队列中选择适当进程来执行。<ul><li>优：不需要专门处理机任务分派</li><li>缺：处理机个数多，对就绪队列的访问有问题</li></ul></li><li>成组调度：将一个进程中的一组线程，每次同时分派到一组处理机上执行，在剥夺处理机时也同时对这一组线程进行。</li><li>专用处理机调度：每个线程分配一个CPU</li></ul><h2 id="死锁"><a class="markdownIt-Anchor" href="#死锁"></a> 死锁</h2><p>每个进程无限等待组内其他进程所占有的资源。</p><p>原因：资源竞争，并发执行的顺序不当。</p><ul><li>可剥夺资源：获得后还可被其他进程或系统剥夺（CPU，内存）</li><li>非可剥夺资源：分配后不能强行收回，只能自行释放（打印机）</li><li>临时性资源：一个进程产生，被另一个进程使用，短时间后便无用（消息）</li></ul><p><mark>必要条件</mark></p><blockquote><ul><li>互斥：进程对分配到的资源进行排他性使用。</li><li>请求和保持：进程已经保持至少一个资源，但又提出了新的资源请求，而该资源已被其他进程占有，此时请求进程阻塞，但仍占有已获得的资源。</li><li>不可剥夺：已获得的资源未使用前不能被剥夺，只能使用完自己释放。</li><li>环路等待：必然存在一个进程—资源的环形链，循环等待。</li></ul></blockquote><p><strong>活锁和饥饿</strong></p><ul><li><p>活锁：任务没有被阻塞，由于某些条件没有满足导致重复尝试。</p><blockquote><p>与死锁区别：处于活锁的实体是在不断地改变状态，而处于死锁的实体表现为等待。活锁可能自行打开。避免：先来先服务</p></blockquote></li><li><p>饥饿：资源分配策略的不公平导致长时间等待。</p></li></ul><p><strong>允许死锁发生：鸵鸟算法</strong></p><h3 id="死锁预防静态"><a class="markdownIt-Anchor" href="#死锁预防静态"></a> 死锁预防（静态）</h3><ul><li><p>打破互斥条件：允许进程同时访问某些资源。</p></li><li><p>打破请求且保持条件：实行资源预先分配策略。只有满足当前进程全部资源才能够一次性分配所申请的资源。</p><blockquote><p>缺点：有些进程动态不可预测；资源利用率低；降低并发性</p></blockquote></li><li><p>打破不可剥夺条件：允许进程强行从占有者那里夺取某些资源</p><blockquote><p>缺点：降低系统性能</p></blockquote></li><li><p>打破循环等待条件：实行资源有序分配策略，将资源事先分类标号，按号分配。<mark>将资源实现编号，只有占有了小号资源才能申请大号</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062206880.png" alt="" /></p><blockquote><p>缺点：限制进程对资源的请求，对系统中所有资源合理编号也复杂，增加系统开销；暂不使用的资源也要提前申请，增加进程对资源的占用时间。</p></blockquote></li></ul><h3 id="死锁避免动态"><a class="markdownIt-Anchor" href="#死锁避免动态"></a> 死锁避免（动态）</h3><p>安全序列：对于每一个进程<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">P_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，他需要的资源可以被系统中当前可用资源加上所有进程<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mi>j</mi></msub><mo stretchy="false">(</mo><mi>j</mi><mo>&lt;</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P_j(j&lt;i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mclose">)</span></span></span></span>当前占有资源之和满足。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062206751.png" alt="" /></p><h4 id="银行家算法"><a class="markdownIt-Anchor" href="#银行家算法"></a> 银行家算法</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062206989.png" alt="" /></p><p>如果work大于等于需要，就可以finish。</p><h4 id="资源分配图"><a class="markdownIt-Anchor" href="#资源分配图"></a> 资源分配图</h4><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" style="zoom:80%;" /><h5 id="rag算法"><a class="markdownIt-Anchor" href="#rag算法"></a> RAG算法</h5><p>封锁进程：某个进程由于请求了超过系统中现有的未分配资源数目资源，而被系统封锁的进程。</p><p>未封锁进程：没有被进程封锁的进程。</p><p>化简：未封锁进程，将请求边变成分配边，一段时间后资源全部释放。直到所有进程变成孤立点。</p><p><a href="https://blog.csdn.net/baidu_41774120/article/details/101998375">操作系统------资源分配图化简-CSDN博客</a></p><ul><li>计算出所有资源的空闲量：总数-出度</li><li>看每个进程：如果请求边&lt;=资源空闲量，删去所有边</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062206478.png" alt="" /></p><h3 id="死锁解除"><a class="markdownIt-Anchor" href="#死锁解除"></a> 死锁解除</h3><ul><li>剥夺资源：使用挂起/激活挂起一些进程，剥夺他们的资源以解除死锁，条件满足后再激活进程。</li><li>撤销进程：使全部死锁的进程夭折；按照某种顺序逐个撤销（回退）进程，直至有足够的资源可用，死锁状态消除。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062206485.png" alt="" /></p><h1 id="io管理"><a class="markdownIt-Anchor" href="#io管理"></a> I/O管理</h1><p>目的：提高I/O访问效率，方便用户使用，方便对设备的控制。</p><p>功能：提供用户接口（命令&amp;编程）；设备分配和释放；设备的访问和控制；I/O缓冲和调度。</p><p>总线：数据线，地址线，控制线（接入I/O设备主要方式）</p><h2 id="io管理概述"><a class="markdownIt-Anchor" href="#io管理概述"></a> I/O管理概述</h2><h3 id="软件角度"><a class="markdownIt-Anchor" href="#软件角度"></a> 软件角度</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062207013.png" alt="" /></p><p>I/O设备管理可直接从应用程序或文件系统得到请求并负责完成这个请求。包括：</p><ul><li>逻辑I/O：完成设备无关的操作，设备分配、回收，数据准备</li><li>设备驱动程序：负责对设备控制器进行控制（读写寄存器）</li><li>中断服务程序：设备工作结束后负责向CPU发中断信号</li></ul><p>特点：速度差异大，接口复杂，传输单位不同，错误多样，与文件系统及其他功能联系紧密</p><h3 id="分类-2"><a class="markdownIt-Anchor" href="#分类-2"></a> 分类</h3><p><strong>按数据组织</strong></p><blockquote><ul><li>块设备：以数据块为单位存储，传输信息。传输效率高，可寻址（随机读写）</li><li>字符设备：以字符为单位存储。传输效率低，不可寻址。</li></ul></blockquote><p><strong>按用途分类</strong></p><blockquote><ul><li>存储设备：磁盘，磁带。</li><li>传输设备：网卡，Modem。</li><li>人机交互设备：显示器，键盘，鼠标。</li></ul></blockquote><p><strong>资源分配角度</strong></p><blockquote><ul><li>独占设备：只能由一个进程使用的设备（打印机）</li><li>共享设备：允许多个进程共同使用（硬盘）</li><li>虚设备：在一类设备上模拟另一类设备，用共享设备模拟独占设备，用高速设备模拟低速设备。</li></ul></blockquote><h3 id="io管理目标和任务"><a class="markdownIt-Anchor" href="#io管理目标和任务"></a> I/O管理目标和任务</h3><blockquote><p>1.按照用户请求，控制设备操作，完成I/O设备与内存间的数据交换，最终完成用户的I/O请求。</p></blockquote><ul><li>设备的分配与回收：记录设备状态；根据用户的请求和设备的类型，采用一定的分配算法，选择一条数据通路。</li><li>执行设备驱动程序，实现真正的I/O操作。</li><li>设备中断处理：处理外部设备的中断。</li><li>缓冲区管理：管理不同的I/O缓冲区。</li></ul><blockquote><p>2.建立方便、统一的独立于设备的接口。</p></blockquote><ul><li>方便性：向用户提供易于使用的外部设备接口。</li><li>统一性：对不同的设备采用统一的操作方式，即在用户程序中使用逻辑设备（对物理设别的抽象，屏蔽物理硬件的细节）</li></ul><blockquote><p>3.充分利用各种技术提高CPU与设备、设备与设备之间的并行工作能力，充分利用资源。由于CPU与I/O间的速度差异很大，应尽可能减少速度差异造成的整体性能开销，尽可能使CPU与设备都处于充分忙碌状态。</p></blockquote><blockquote><p>4.保护：设备传送或管理的数据应该是安全的、 不被破坏的、保密的。</p></blockquote><h2 id="io硬件组成"><a class="markdownIt-Anchor" href="#io硬件组成"></a> I/O硬件组成</h2><p>I/O设备由机械部件和电子部件（设备控制器：<font color='orange'><strong>是硬件</strong></font>）组成</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062207855.png" alt="" /></p><h3 id="设备控制器"><a class="markdownIt-Anchor" href="#设备控制器"></a> 设备控制器</h3><p>CPU与I/O设备的中介，实现CPU对I/O设备的控制</p><h4 id="功能"><a class="markdownIt-Anchor" href="#功能"></a> 功能</h4><ul><li>接收和识别CPU命令（控制寄存器：存放命令和参数read&amp;write）</li><li>数据交换：CPU与控制器</li><li>设备状态的了解和报告（状态寄存器）</li><li>数据交换（数据寄存器）</li><li>设备地址识别（判断读写哪个寄存器）</li><li>缓冲区</li><li>对设备传来的数据进行差错检测</li></ul><h4 id="组成"><a class="markdownIt-Anchor" href="#组成"></a> 组成</h4><ul><li>控制器与CPU接口：数据寄存器、控制寄存器、状态寄存器</li><li>控制器与设备接口：数据信号、控制信号、状态信号</li><li>I/O逻辑：用于实现CPU对I/O设备的控制</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062207865.png" alt="" /></p><p><strong>可能对应多个设备，寄存器可能对应也有多个。如何编址？</strong></p><ul><li><p>内存映射I/O（MIPS）：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406061031228.png" alt="" style="zoom:67%;" /></p><p>寄存器与内存地址统一编址</p><ul><li>优点：不需要特殊的保护机制来阻止用户进程进行相应的 I/O 操作</li><li>缺点：不能对控制寄存器的内容进行高速缓存</li></ul></li><li><p>I/O独立编址：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406061033245.png" alt="" /></p><p>控制器中的寄存器使用单独的地址</p><ul><li>优点：外设不占用内存的地址空间，以区分对内存操作还是I/O操作</li><li>缺点：操作指令类型少，操作不灵活</li></ul></li></ul><h2 id="io控制技术"><a class="markdownIt-Anchor" href="#io控制技术"></a> I/O控制技术</h2><h3 id="程序控制io"><a class="markdownIt-Anchor" href="#程序控制io"></a> 程序控制I/O</h3><p>由CPU代表进程向I/O模块发出指令，然后进入忙等状态，直到操作完成之后进程才能够继续执行。</p><p>CPU:开始发送指令，不断轮询检查状态，完成后传入内存</p><p>数据传送单位：字</p><p>优点：实现简单</p><p><strong>缺点：CPU与I/O只能串行工作，I/O工作时，CPU忙等轮询检查，CPU效率低</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062208470.png" alt="" /></p><ul><li>应用程序提出读数据请求</li><li>设备驱动程序检查设备的状态</li><li>如果状态正常，给设备发出响应的控制命令</li><li>不断轮询检查是否完成执行过程</li><li>设备控制器完成操作，把数据送给应用程序</li><li>应用程序继续进行相应的处理</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062208039.png" alt="" /></p><h3 id="中断驱动方式"><a class="markdownIt-Anchor" href="#中断驱动方式"></a> 中断驱动方式</h3><p>当I/O操作结束后设备控制器主动的来通知设备驱动程序，而不是依靠设备驱动程序不断轮询查看设备的状态</p><p>CPU：开始时发出I/O指令，然后阻塞该进程，继续运行进程，直至接受中断指令，完成后处理中断。</p><p>数据传送单位：字（一次中断传送一字）</p><p>优点：实现CPU与I/O并行工作</p><p>缺点：每次传送一个字，频繁中断处理消耗CPU很多时间</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062208145.png" alt="" /></p><ul><li>用户程序提出I/O请求</li><li>设备驱动程序检查设备的状态</li><li>如果设备准备好，就向设备发出控制命令</li><li>将状态记录在设备状态表中，CPU继续其他工作</li><li>设备完成工作后向CPU发中断信号，转入中断处理程序</li><li>中断处理程序发现这是一个正常的完成了控制命令的信号后，把结果转发给设备管理程序</li><li>设别管理程序从设备状态表里查询是哪个请求的完成</li><li>把相应数据送到应用程序</li><li>通知应用程序可以继续执行</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062208840.png" alt="" /></p><h3 id="dma"><a class="markdownIt-Anchor" href="#dma"></a> DMA</h3><p>直接存储器访问方式，由一个专门的控制器来完成数据从内存到设备或者是从设备到内存的传输工作.</p><ul><li>由程序设置DMA控制器中的若干寄存器值（如内存始址、传送字节数），然后发起I/O操作</li><li>DMA控制器完成内存与外设的成批数据交换</li><li>在操作完成时由DMA控制器向CPU发出中断</li></ul><p><strong>寄存器</strong></p><ul><li>命令/状态寄存器CR：接收CPU发送来的I/O命令</li><li>内存地址寄存器MAR：输入——把数据从设备传送到内存的起始目标地址，输出——存放由内存到设备的内存源地址</li><li>数据寄存器DR：暂存从设备到内存，或从内存到设备</li><li>数据计数器DC：存放本次CPU要读或写的字节数</li></ul><p>优点：CPU只需干预I/O操作的开始和结束，而后续成批的数据读写无需CPU控制，使用<mark>高速设备</mark></p><p>缺点：数据传送方向，存放数据的内存及传送数据的长度由CPU控制</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406022105890.png" alt="" /></p><blockquote><p>与中断方式的区别：</p><ul><li>中断每个单位数据传送完成中断CPU，DMA传送一批数据完成后中断CPU</li><li>中断数据传送由CPU完成，DMA由DMA控制器完成，只有开始和结束需要CPU干预</li><li>中断具有对异常事件的处理能力，DMA控制方式适用于数据块的传输</li></ul></blockquote><p>数据传送单位：块（读入内存也要连续！）</p><p>数据流向：可以直接从设备放入内存&amp;内存到设备</p><p><strong>只需要在传送开始和结束才需要CPU干预</strong></p><h3 id="io通道"><a class="markdownIt-Anchor" href="#io通道"></a> I/O通道</h3><p><strong>进一步减少CPU的干预</strong></p><p><strong>CPU：向通道发出I/O指令，指明通道程序的内存位置，要操作的I/O设备，然后就切换进程</strong></p><p>与DMA原理几乎一样。I/O通道专门负责数据输入输出的传输控制。CPU将“传输控制”的功能下放给通道后只负责“数据处理”功能。这样，通道与CPU分时使用内存 ，实现了CPU内部运算与I/O设备的并行工作。</p><p>优点：执行一个通道程序可以完成几组I/O操作，与DMA相比，减少了CPU干预</p><p>缺点：费用高</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406022133674.png" alt="" style="zoom:50%;" /><ul><li>字节多路通道：以字节为单位交叉工作，<mark>中低速I/O设备</mark></li><li>数组选择通道：以“组方式”工作，每次传输一批数据，速率高，但一段时间只能为一台设备服务。<mark>连接磁盘、磁带等高速设备</mark></li><li>数组多路通道：洁亮两者特点。对通道程序采用多道程序设计技术，使得与通道连接的设备可以并行工作</li></ul><blockquote><p>与DMA区别：</p><ul><li>DMA方式下数据传送方向，存放数据的内存及传送数据的长度由CPU控制；而通道通过执行通道程序实现对数据传输的控制，更强的独立处理I/O功能</li><li>DMA只能控制一台&amp;少数同类设备；通道同时控制多种设备</li></ul></blockquote><h2 id="io软件组成"><a class="markdownIt-Anchor" href="#io软件组成"></a> I/O软件组成</h2><h3 id="分层设计思想"><a class="markdownIt-Anchor" href="#分层设计思想"></a> 分层设计思想</h3><blockquote><p>软件组织成多个层次，每层实现一部分功能，依赖更低一层的原始功能，从而隐藏功能细节；给高一层提供服务。</p><p>低层考虑硬件特性，向高层软件提供接口；高层不依赖于硬件，向用户提供友好接口。</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062209378.png" alt="" /></p><ul><li>用户性软件通过“系统调用”请求操作系统内核的服务。</li><li>设备独立性软件：处理系统调用（向上处理接口），对设备的保护，差错处理，设备的分配与回收，映射关系逻辑设备表（逻辑设备——物理设备），缓冲区管理</li><li>设备驱动程序：自动配置和初始化子程序，I/O操作子程序，中断服务子程序</li></ul><h3 id="设备独立性"><a class="markdownIt-Anchor" href="#设备独立性"></a> 设备独立性</h3><p>逻辑设备——物理设备</p><blockquote><p>使用逻辑设备名称来请求使用某类设备，而系统在实际执行时，还必须使用物理设备名称。 （所以系统需具有逻辑设备名称转换为物理设备名称的功能）</p></blockquote><ul><li>设备分配的灵活性：直接使用物理名称容易阻塞；逻辑名称可分配给同类设备</li><li>易于实现I/O重定向：设备更换不必改变应用程序</li></ul><h4 id="逻辑设备名到物理设备名的映射"><a class="markdownIt-Anchor" href="#逻辑设备名到物理设备名的映射"></a> 逻辑设备名到物理设备名的映射</h4><p>逻辑设备表LUT</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031006394.png" alt="" /></p><ul><li>整个系统设置一张LUT（不能使用相同逻辑设备名，多用户难实现）</li><li>每个用户设置一张LUT</li></ul><h3 id="设备驱动程序"><a class="markdownIt-Anchor" href="#设备驱动程序"></a> 设备驱动程序</h3><p>每个设备驱动程序处理一种设备类型。</p><p><strong>任务：接收来自于设备无关的上层软件的抽象请求，并执行这个请求</strong></p><ul><li>自动配置和初始化子程序</li><li>I/O操作子程序：调用该子程序是系统调用的结果。执行该部分程序时，系统仍认为是和调用进程属同一个进程，只是由用户态变成核心态</li><li>中断服务子程序</li></ul><h2 id="io缓冲管理"><a class="markdownIt-Anchor" href="#io缓冲管理"></a> I/O缓冲管理</h2><p><mark>利用内存</mark></p><p>提高外设利用率</p><blockquote><ul><li>匹配CPU与外设的不同处理速度</li><li>减少对CPU的中断次数</li><li>提高CPU和I/O设备之间的并行性</li></ul></blockquote><h3 id="单缓冲"><a class="markdownIt-Anchor" href="#单缓冲"></a> 单缓冲</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031016140.png" alt="" /></p><p>平均处理一个块所需的时间：从一个状态到下一次回到这个状态</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406061507940.png" alt="" /></p><p>总结：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>T</mi><mo stretchy="false">)</mo><mo>+</mo><mi>M</mi></mrow><annotation encoding="application/x-tex">Max(C,T)+M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span></span></span></span></p><h3 id="双缓冲"><a class="markdownIt-Anchor" href="#双缓冲"></a> 双缓冲</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031017779.png" alt="" /></p><p>平均处理一个块所需的时间：从工作区空，其中一个缓冲区满，另一个缓冲区空到回到这个状态</p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><mi>T</mi><mo separator="true">,</mo><mi>C</mi><mo>+</mo><mi>M</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Max(T,C+M)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mclose">)</span></span></span></span></p><h3 id="环形缓冲"><a class="markdownIt-Anchor" href="#环形缓冲"></a> 环形缓冲</h3><p>多个指针区分空缓冲区，已装满数据的缓冲区，正在使用的缓冲区</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031019576.png" alt="" /></p><h3 id="缓冲池"><a class="markdownIt-Anchor" href="#缓冲池"></a> 缓冲池</h3><p>上面消耗大量内存空间，利用率不高。而缓冲池设置了多个可供若干进程共享的缓冲区</p><blockquote><p>相同类型的缓冲区链成队列：空缓冲队列，输入队列，输出队列<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031028853.png" alt="" /></p></blockquote><ul><li>收容输入：调用<code>Getbuf(emq)</code>从空缓冲队列取出队首，数据输入其中，装满后调用<code>Putbuf(inq,hin)</code>，将其挂在输入队列上。</li><li>提取输入：调用<code>Getbuf(inq)</code>从输入队列队首取出，提取数据后，调用<code>Putbuf(emq,sin)</code>，将其挂到空缓冲队列emq上。</li><li>收容输出：调用<code>Getbuf(emq)</code>从空缓冲队列取出队首，装满输出数据后，调用<code>Putbuf(outq,hout)</code>将缓冲区挂在outq末尾。</li><li>提取输出：调用<code>Getbuf(outq)</code>从输出缓冲队列取出队首，提取数据后，调用<code>Putbuf(emq,sout)</code>将缓冲区挂在空缓冲队列末尾。</li></ul><p><strong><mark>取队头，挂队尾</mark></strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031029889.png" alt="" /></p><h2 id="io设备管理"><a class="markdownIt-Anchor" href="#io设备管理"></a> I/O设备管理</h2><p>解决外设共享问题，以提高外设资源的利用率</p><ul><li>进程间交替使用外设（键盘&amp;鼠标）</li><li>通过一个虚拟设备把设备与应用进程隔开，只由虚拟设备使用设备</li></ul><h3 id="数据结构"><a class="markdownIt-Anchor" href="#数据结构"></a> 数据结构</h3><ol><li>设备控制表DCT：每个设备一张，描述设备特性和状态<ul><li>设备队列队首指针：请求为得到满足的进程（PCB）</li><li>设备状态：忙/闲</li><li>控制器表指针</li><li>重复执行次数：发生错误重传</li></ul></li><li>控制器控制表</li><li>通道控制表</li><li>系统设备表</li></ol><h3 id="spooling技术"><a class="markdownIt-Anchor" href="#spooling技术"></a> SPOOLing技术</h3><p><mark>假脱机技术：软件方式模拟实现脱离主机的控制进行I/O操作</mark></p><p>应用程序进行I/O操作时，实际是和SPOOLing程序交换数据，从SPOOLing程序的缓冲池读出数据或把数据读入缓冲池，而不是跟实际的外设进行I/O操作</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406031104258.png" alt="" /></p><ul><li>输入井和输出井：<strong>磁盘</strong>上开辟的存储空间。模拟脱机输入输出</li><li>输入缓冲区和输出缓冲区：缓和CPU与磁盘之间的速度不匹配，在内存开辟的缓冲区。暂存输入设备送来的数据和将要传送给输出设备的数据</li><li>输入进程和输出进程</li></ul><h4 id="特点"><a class="markdownIt-Anchor" href="#特点"></a> 特点</h4><ul><li>高速模拟I/O操作</li><li>实现对独享设备的共享：由spooling程序提供虚拟设备，对独享设备依次共享使用（独占设备——&gt;共享设备）</li></ul><h2 id="io性能问题"><a class="markdownIt-Anchor" href="#io性能问题"></a> I/O性能问题</h2><ul><li>使CPU利用率尽可能不被I/O降低</li><li>使CPU尽可能摆脱I/O</li></ul><h1 id="磁盘管理"><a class="markdownIt-Anchor" href="#磁盘管理"></a> 磁盘管理</h1><p><strong>结构</strong></p><ul><li>磁盘</li><li>磁道：盘偏上以盘片中心为圆心，不同半径的同心圆</li><li>扇区：磁盘划分圆心角度相同的扇区，存储固定大小（盘块）</li><li>柱面：不同盘片相同半径的磁道组成，<strong>离轴心最远的编号为0</strong></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062211722.png" alt="" /></p><p>读一个扇区：柱面&amp;磁头&amp;扇区三个参数</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062211175.png" alt="" /></p><h2 id="磁盘的组织和调度"><a class="markdownIt-Anchor" href="#磁盘的组织和调度"></a> 磁盘的组织和调度</h2><h3 id="组织模式"><a class="markdownIt-Anchor" href="#组织模式"></a> 组织模式</h3><h4 id="chs模式"><a class="markdownIt-Anchor" href="#chs模式"></a> CHS模式</h4><p>磁头数NH，柱面数NC，扇区数NS</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">磁</mi><mi mathvariant="normal">盘</mi><mi mathvariant="normal">容</mi><mi mathvariant="normal">量</mi><mo>=</mo><mi mathvariant="normal">磁</mi><mi mathvariant="normal">头</mi><mi mathvariant="normal">数</mi><mo>×</mo><mi mathvariant="normal">柱</mi><mi mathvariant="normal">面</mi><mi mathvariant="normal">数</mi><mo>×</mo><mi mathvariant="normal">扇</mi><mi mathvariant="normal">区</mi><mi mathvariant="normal">数</mi><mo>×</mo><mn>512</mn><mi mathvariant="normal">字</mi><mi mathvariant="normal">节</mi></mrow><annotation encoding="application/x-tex">磁盘容量=磁头数×柱面数×扇区数×512字节</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">磁</span><span class="mord cjk_fallback">盘</span><span class="mord cjk_fallback">容</span><span class="mord cjk_fallback">量</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">磁</span><span class="mord cjk_fallback">头</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">柱</span><span class="mord cjk_fallback">面</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">扇</span><span class="mord cjk_fallback">区</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord">1</span><span class="mord">2</span><span class="mord cjk_fallback">字</span><span class="mord cjk_fallback">节</span></span></span></span></span></p><h4 id="lba模式"><a class="markdownIt-Anchor" href="#lba模式"></a> LBA模式</h4><blockquote><p>将磁盘驱动器看做一个一维的逻辑块的数组，逻辑块是最小的传输单位。</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#lba =（＃c * H +＃h）* S +＃s-1</span><br></pre></td></tr></table></figure><ul><li>#c、#h、#s分别是磁柱、磁头、扇区的编号</li><li>#lba是逻辑区块编号</li><li>H=heads per cylinder，每个磁柱的磁头数</li><li>S=sectors per track，每磁道的扇区数</li></ul><h3 id="空间管理"><a class="markdownIt-Anchor" href="#空间管理"></a> 空间管理</h3><p>位图：每一个物理块对应一位，分配出去为0，否则为1.</p><p>空闲表：记录起始块号，块数</p><p>成组链接法：把空白物理块分成组，再通过指针把组与组之间链接起来<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062211981.png" alt="" /></p><h3 id="磁盘访问时间"><a class="markdownIt-Anchor" href="#磁盘访问时间"></a> 磁盘访问时间</h3><p>寻道时间：把磁头从当前位置移动到指定刺刀上的时间。s（启动磁盘），n（移动磁道数）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>s</mi></msub><mo>=</mo><mi>m</mi><mo>×</mo><mi>n</mi><mo>+</mo><mi>s</mi></mrow><annotation encoding="application/x-tex">T_s=m\times n+s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">m</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span></span></p><p>旋转延迟时间：r（旋转速度RPM：一分钟转几圈）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>r</mi></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mo>×</mo><mi>r</mi></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mo>×</mo><mi>R</mi><mi>P</mi><mi>M</mi><mo>×</mo><mn>60</mn></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_r=\frac{1}{2\times r}=\frac{1}{2\times RPM \times 60}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.09077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.09077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">6</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>传输时间：把数据从磁盘读出&amp;向磁盘写入数据。b（读写的字节数），r（旋转速度），N（磁道上的字节数）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>t</mi></msub><mo>=</mo><mfrac><mi>b</mi><mrow><mi>r</mi><mo>×</mo><mi>N</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_t=\frac{b}{r\times N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.14077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.37144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>总访问时间：寻道时间+旋转延迟时间+传输时间</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>a</mi></msub><mo>=</mo><msub><mi>T</mi><mi>s</mi></msub><mo>+</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mi>r</mi></mrow></mfrac><mo>+</mo><mfrac><mi>b</mi><mrow><mi>r</mi><mi>N</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_a=T_s+\frac{1}{2r}+\frac{b}{rN}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.05744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.37144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><h3 id="磁盘调度算法"><a class="markdownIt-Anchor" href="#磁盘调度算法"></a> 磁盘调度算法</h3><p>先来先服务FCFS</p><blockquote><p>按访问请求到达的先后顺序。</p><p>优：简单公平</p><p>缺：相邻请求可能反复移动，效率低</p></blockquote><p>最短寻道时间优先SSTF：解决效率低</p><blockquote><p>优先选择据当前磁头最近的访问请求</p><p>优：改善磁盘平均服务时间</p><p>缺：饥饿现象，某些访问长期等待</p></blockquote><p>扫描算法SCAN电梯调度：解决饥饿</p><blockquote><p>磁头按一个方向移动，移动过程中对遇到的访问请求进行服务，知道磁头步进到==最内（最外）==调转扫描方向。</p><p>优：克服SSTF缺点，考虑了距离&amp;方向</p><p>缺：摆动式，两侧访问频率低于中间</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062212022.png" alt="" style="zoom:80%;" /></blockquote><p>循环扫描算法C-SCAN：解决两端不公平</p><blockquote><p>按照要访问的柱面位置的次序选择访问者。到达最后一个柱面后，带动磁头快速返回到0号柱面，返回时不服务任何。</p><p>优：增加两侧访问频率</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062212869.png" alt="" style="zoom:80%;" /></blockquote><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" style="zoom:80%;" /><h2 id="提高磁盘io性能"><a class="markdownIt-Anchor" href="#提高磁盘io性能"></a> 提高磁盘I/O性能</h2><ul><li><p>选择性能好的磁盘</p></li><li><p>并行化</p></li><li><p>采用适当的调度算法</p></li><li><p>设置磁盘高速缓冲区 <mark>在内存中</mark></p><blockquote><p>形式：独立缓存，以虚拟内存为缓存</p><p>数据交付：直接交付（copy开销），指针交付（内存管理复杂）</p><p>置换算法LRU</p><p>周期性写回：将disk cache中被修改过的内容写回磁盘</p></blockquote></li><li><p>优化数据布局：1.连续摆放，磁头移动距离最小 2.优化索引节点的分布</p></li><li><p>提交读：顺序访问，提前读入下一块到缓冲区</p></li><li><p>延迟写</p></li><li><p>虚拟盘</p></li></ul><h2 id="廉价冗余磁盘阵列raid"><a class="markdownIt-Anchor" href="#廉价冗余磁盘阵列raid"></a> 廉价冗余磁盘阵列—RAID</h2><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406060955933.png" alt="" style="zoom:80%;" /><p>把多个相对便宜的硬盘组合成硬盘组，提供比单个硬盘更高的存储性能和提供数据冗余（用户数据损坏，利用冗余信息可以使损失数据得以恢复）的技术</p><ul><li>价格低，功效小，传输速率高（并行传输）</li><li>可提供容错功能</li></ul><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" style="zoom:80%;" /><h3 id="raid0"><a class="markdownIt-Anchor" href="#raid0"></a> RAID0</h3><p>条带化存储：有N个磁盘组成的是单个磁盘读写速度的N倍</p><p>数据传输率高，没有数据冗余。<strong>但是没有冗余校验功能</strong></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406060930608.png" alt="" style="zoom:80%;" /><h3 id="raid1"><a class="markdownIt-Anchor" href="#raid1"></a> RAID1</h3><p>镜像存储：  通过磁盘数据镜像实现数据冗余， 在成对的独立磁盘上产生互为备份的数据。原始数据繁忙，直接从镜像拷贝读取数据。</p><p>读性能好，写性能由最差的磁盘决定，可靠性好，代价较高</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406060930375.png" alt="" /></p><h3 id="raid2"><a class="markdownIt-Anchor" href="#raid2"></a> RAID2</h3><p>海明码校验+条带存储，码距为3</p><p>需要多个磁盘来存放海明校验码信息，冗余磁盘数量与数据磁盘数量的对数成正比</p><p>易出错，没有商业化</p><h3 id="raid3"><a class="markdownIt-Anchor" href="#raid3"></a> RAID3</h3><p>奇偶校验+条带存储，读写要访问组中所有盘，每组一个校验盘</p><p>缺：恢复时间长， 奇偶校验盘成为瓶颈</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406060954795.png" alt="" style="zoom:80%;" /><h1 id="文件系统"><a class="markdownIt-Anchor" href="#文件系统"></a> 文件系统</h1><h2 id="文件系统基本概念"><a class="markdownIt-Anchor" href="#文件系统基本概念"></a> 文件系统基本概念</h2><p>文件：数据存储和访问的单位，对用户数据的逻辑抽象。<mark>连续逻辑地址空间，对磁盘的抽象</mark></p><ul><li>用户：屏蔽访问外村上的数据的复杂性</li><li>磁盘等资源：提高资源的利用率，优化性能</li></ul><p>管理需求：</p><blockquote><ul><li>用户（使用逻辑文件）：使用的用户接口。</li><li>操作系统（组织和管理物理文件）：实现功能（管理存储空间，布局，存储位置）</li></ul></blockquote><h3 id="三个层次"><a class="markdownIt-Anchor" href="#三个层次"></a> 三个层次</h3><p>1.文件系统的接口：命令行接口，程序接口</p><p>2.对象操作管理的软件集合</p><p>3.对象及属性：文件，目录，磁盘存储空间</p><blockquote><p>目录</p><p>文件说明索引组成的用于文件检索的特殊文件。</p><p>内容：文件访问和控制的信息（文件名，文件类型，地址信息，访问控制信息，使用信息）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062214839.png" alt="" /></p><p><strong>多级目录</strong>：通过绝对路径&amp;相对路径&amp;当前目录（.）&amp;上一级目录（…）</p><p><strong>层次清楚，解决文件重名问题，查找速度快，目录级别太多</strong></p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406061633709.png" alt="" /></p><h2 id="文件系统实现方法"><a class="markdownIt-Anchor" href="#文件系统实现方法"></a> 文件系统实现方法</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062215020.png" alt="" /></p><h3 id="文件控制块"><a class="markdownIt-Anchor" href="#文件控制块"></a> 文件控制块</h3><blockquote><ul><li>基本信息：文件名，物理位置，文件逻辑结构，文件物理结构</li><li>访问控制信息：文件所有者，访问权限</li><li>使用信息：创建时间，上一次修改时间</li></ul></blockquote><p>文件控制块vs文件描述符</p><ul><li><p>文件控制块：描述文件基本信息</p></li><li><p>文件描述符：唯一标识一个打开的文件，非负整数</p></li></ul><h3 id="文件逻辑结构和物理结构"><a class="markdownIt-Anchor" href="#文件逻辑结构和物理结构"></a> 文件逻辑结构和物理结构</h3><h4 id="文件逻辑结构"><a class="markdownIt-Anchor" href="#文件逻辑结构"></a> 文件逻辑结构</h4><p>以字节为单位的流式结构、记录式文件结构（存取文件信息的最小单位是：记录）、树形结构</p><p>用户层面看：文件如何组织</p><ul><li>提高紧缩效率</li><li>便于修改</li><li>降低文件存储代价</li></ul><h4 id="文件物理结构"><a class="markdownIt-Anchor" href="#文件物理结构"></a> 文件物理结构</h4><p>操作系统角度：在存储介质上的存放方式</p><h5 id="连续顺序结构"><a class="markdownIt-Anchor" href="#连续顺序结构"></a> 连续（顺序）结构</h5><p>优：结构简单，效率高</p><p>缺：文件长度一经固定不易改变，不利于动态增加和修改</p><p><mark>适合变化不大的文件</mark></p><h5 id="串联链接文件"><a class="markdownIt-Anchor" href="#串联链接文件"></a> 串联/链接文件</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062215950.png" alt="" /></p><p>每个物理块的最后一个字为链接字，链首指针放在文件目录。</p><p>优：空间利用率高，便于动态扩充修改，顺序存取效率高（类似页式）</p><p>缺：随机存取效率太低，如果访问最后内容，实际访问整个文件；指针出错，可靠性低；链接指针占用空间。</p><h5 id="索引结构"><a class="markdownIt-Anchor" href="#索引结构"></a> 索引结构</h5><p>将每个物理块号存放在索引中，FCB只记录索引表的地址。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062215044.png" alt="" /></p><p>索引文件：数据文件+索引表</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062216575.png" alt="" /></p><p>先通过文件名读出索引块的内容，再通过索引块中的索引表找出文件的各个物理块号。</p><p>优（保持链接结构优点又避免缺点）：能顺序&amp;随机存取，满足文件动态增长，充分利用外存。</p><p>缺：索引表本身开销（内外存空间，存取时间）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062216365.png" alt="" /></p><h6 id="索引表的组织"><a class="markdownIt-Anchor" href="#索引表的组织"></a> 索引表的组织</h6><ul><li><p>链接模式：一个盘块一个索引表，多个索引表链接起来</p></li><li><p>多级索引：将一个大文件的所有索引表的地址存在放另一个索引表中</p><p>直接索引——从索引表中直接读出磁盘块号</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062216958.png" alt="" /></p></li><li><p>综合：两者结合</p></li></ul><h3 id="目录"><a class="markdownIt-Anchor" href="#目录"></a> 目录</h3><p>实现方法：</p><blockquote><ul><li>直接法：目录项=文件名+文件控制块</li><li>间接法：目录项=文件名+文件控制块的地址（索引号，如unix的inode）</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062216156.png" alt="" style="zoom:80%;" /></blockquote><p>长文件名：</p><blockquote><ul><li>文件名固定使用255字符：浪费空间</li><li>目录项长度，文件的属性信息（不变），文件名（可变）：文件被删除，占用的空间不易回收</li><li>目录项本身长度固定，把文件名统一放在目录文件的末尾。</li></ul></blockquote><p>查询：</p><blockquote><ul><li>顺序查询：依次扫描符号文件目录中的表目，将表目的名字字段与查找的符号名NAME比较</li><li>Hash查询：利用易于实现的变换函数，把每个符号名唯一的变换成符号表中的表目索引</li></ul></blockquote><p>便于共享的目录组织：使存储空间内保存一份副本，而所有要共享该文件的用户可用<mark>相同的或不同</mark>的文件名来访问它。</p><blockquote><p>软连接：符号连接，重定向到某一个文件（相当于快捷方式？）inode不增加</p><p>硬连接：不能针对目录创建、不能针对不存在的文件创建。innode 连接数就会增加 1</p></blockquote><p>保护文件：</p><blockquote><p>建立副本：同一文件保存到多个存储介质上（短小&amp;重要）</p><p>定时转储：每隔一段时间转储到其他存储介质上</p><p>一致性检查：</p><ul><li>磁盘块的一致性：</li></ul></blockquote><p>文件的存取控制：</p><blockquote><p>文件保护机制：</p><p>存取权限验证步骤：存取控制矩阵、存取控制表、用户权限表、口令</p></blockquote><p>文件的并发访问：多个进程并发访问同一文件</p><blockquote><ul><li>访问文件前必须先打开文件：多个进程访问同一个文件都使用内存中同一个目录内容，保证文件系统的一致性</li><li>文件锁定：协调对文件指定区域的互斥访问</li><li>进程间通信</li></ul></blockquote><p>文件系统性能提高：</p><blockquote><ul><li><p>块高速缓存：类似于cache</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406062217713.png" alt="" /></p></li></ul></blockquote><h1 id="final"><a class="markdownIt-Anchor" href="#final"></a> Final</h1><h2 id="客观题"><a class="markdownIt-Anchor" href="#客观题"></a> 客观题</h2><h3 id="课上小测"><a class="markdownIt-Anchor" href="#课上小测"></a> 课上小测</h3><ol><li><p>分时系统与批处理系统的主要开销是系统切换</p></li><li><p>计算机系统中网络带宽增长速度最快</p></li><li><p>DOS系统增加了网络功能，属于网络操作系统</p></li><li><p>（x）内存紧缩中用的重定位技术与程序链接过程中的重定位是一样的：前者动态重定位，后者编译链接过程中的重定位，主要原因是编译时程序地址在内存中的地址不确定，当多个程序编译链接后计算出程序地址的操作。</p></li><li><p>页式管理缺点：共享数据不方便。共享数据和非共享数据在同一页中，解决：分段管理</p></li><li><blockquote><p>关于多级页表，下列说法不正确的是：（单选）<br />A. 能够减少页表占用内存的大小</p><p>B. 级数越多，平均访问内存的时间越长</p><p>C. 有效的页表项中都会存储页框号</p><p>D. 使用二级页表的平均访存性能优于一级页表</p></blockquote><p>答：D</p><p>多级页表会采用动态调入机制，有一些页表在不需要的时候不调入内存，解决了页表占用大量内存的问题（A正确）。页表级数越多，就需要越多次访问这些不同级的页表，也就是多次访问内存，平均访存时间会增加（B正确，D错误）。有效的页表项中必然会存储页框号，MMU正是凭借页表项中的页框号才找到物理地址（C正确）。</p></li><li><blockquote><p>在Intel x86下从段式地址到线性地址的转换中需要查找的对象可能是：（多选）<br />A. 全局描述符表GDT</p><p>B. 局部描述符表LDT</p><p>C. 页目录</p><p>D. 页表</p></blockquote><p>答：A、B</p><p>逻辑地址的高位取出Segment Selector（相当于段号），然后通过查描述符表来找到对应段的页目录起始地址（x86采用二级页表）。这里的描述符可能查全局描述符表GDT，整个系统独一个；也有可能查局部描述符表LDT，每个进程拥有一个。</p></li><li><blockquote><p>关于段式管理描述不正确的有：（多选）<br />A. 两个段的长度可以不同</p><p>B. 每个段内地址都从0开始</p><p>C. 段页式管理实质上等价于采用两级页表的页式管理</p><p>D. 段内地址是二维的、不连续的</p></blockquote><p>答：C、D</p><p>每个段内地址都从0开始是正确的，而再加上段长不一致，这也是段式地址是二维地址的原因，B正确。段页式管理相当于在页式管理之上再查一次段表，段式+一级页式相当于二级页表，但段式之下也可以嵌套多级页表，例如x86的段式+二级页表模式，相当于三级页表，一方面我们不能说段页式就一定相当于二级页表，另一方面我们也不能说段页式就和多级页表“等价”，二者还是有本质上的区别的，C错误。段式地址整体是二维的不连续的，但段内地址是从0开始的连续地址，D错误。</p></li><li><p>Intel X86下的CR3寄存器中保存的是<strong>页目录基地址</strong>。</p></li><li><p>以下哪个地址不可能是自映射页目录的地址？<br />A. 0x8020 0000<br />B. 0x0000 0000<br />C. 0xC040 0000<br />D. 0x7fdf f000</p><p>通过给出的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><msub><mi>D</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub></mrow><annotation encoding="application/x-tex">PD_{base}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，计算<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><msub><mi>D</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>=</mo><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>+</mo><mi>P</mi><msub><mi>T</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></msub><mo>&gt;</mo><mo>&gt;</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">PD_{base}=PT_{base}+PT_{base}&gt;&gt;10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>,如果不与4MB对齐则错误</p></li><li><p>采用页目录自映射方式，有助于实现用户进程的统一内存布局</p></li><li><blockquote><p>引入线程的优势包括：（多选）<br />A. 有利于提高运行实体的创建和撤销效率</p><p>B. 有利于提高CPU利用率</p><p>C. 有利于提高多个共享数据的计算和IO任务的切换速度</p><p>D. 有利于提高多个并发任务间的通信效率</p></blockquote><p>答：A、B、C、D</p><p>免去进程切换的开销，切换上下文，提升了运行实体创建和撤销的效率，A正确。提升了进程内部的并发程度，进一步提高了CPU利用率，B正确。线程之间直接共享变量，一个线程进行IO，其他线程还可计算，C正确。线程共享变量，提高多个并发任务间的通信效率，D正确。</p></li><li><blockquote><p>以下说法正确的是：<br />A. PThreads API 是一个 Unix 下的线程实现<br />B. PThread_yield 的作用是中止当前线程执行并退出<br />C. PThreads API 可为编程人员提供多线程编程的可移植性<br />D. PThreads API 仅支持创建用户级线程</p></blockquote><p>答案：成为了IEEE标准不只Unix，A错误。释放CPU给其他线程，B错误。PThread API提供了多线程良好的可移植性，只需要操作系统支持其库函数即可，C正确。支持创建用户级线程和内核级线程，D错误。</p></li><li><blockquote><p>以下说法正确的是：（单选）<br />A. 引用全局变量的函数一定不是线程安全的</p><p>B. 引用static变量的函数可以是线程安全的</p><p>C. 线程安全的函数一定是可重入的</p><p>D. 可重入的函数一定是线程安全的</p></blockquote><p>答：B</p><p><mark>线程安全！=可重入</mark></p></li><li><p>（x）在进程处于临界资源时不能进行处理机调度——当然可以，别与死锁弄混</p></li><li><p><strong>只要涉及时间片都是抢占！！！！多级反馈，时间片轮转</strong></p></li><li><blockquote><p>以下关于单调速率调度算法说法正确的是：（单选）<br />A. 当进程数较多的时候，会导致CPU利用率下降到70%左右</p><p>B. 当所有进程请求的CPU利用率之和大于70%时，不存在满足所有进程实时性约束的调度方案</p><p>C. 当所有进程请求的CPU利用率之和小于69%时，一定存在满足所有进程实时性约束的调度方案</p><p>D. CPU利用率越高的进程越被优先调度</p></blockquote><p>答：C</p></li><li><p>信号量可解决任何同步互斥问题</p></li><li><blockquote><p>假设磁盘平均损坏时间是100000小时，采用2块这样磁盘组成RAID 0阵列，其平均损坏时间是：（单选）<br />A. 200000小时</p><p>B. 100000小时</p><p>C. 50000小时</p><p>D. 25000小时</p></blockquote><p>答：C</p><p>RAID是一种把多块独立的硬盘（物理硬盘）按照不同方式组合起来形成一个硬盘组（逻辑硬盘），从而提供比单个硬盘更高的存储性能和提供数据冗余的技术。RAID 0是最低级别的RAID，该级别该级仅提供了并行交叉存取，它虽然有效提高了磁盘IO速度，但并无冗余校验功能。其2块磁盘的平均损坏时间将是单个磁盘的一半。</p></li><li><p>SPOOLing程序和外设进行数据交换使用的是实际I/O。</p></li><li><p>（x）文件控制块中包含了文件描述符</p></li><li><p>（x）文件系统中的源程序文件是有结构的记录式文件——没有结构要求</p></li><li><p>用户态下不能直接进行系统调用。</p></li><li><p>用户进程通过____系统调用___请求操作系统执行需要更高权限的操作（先中断，进入用户态后进行系统调用）</p></li><li><p>下列关于可重入代码说法正确的有：<br />A. 即使只有一个用户进程，使用不可重入代码也可能是不安全的         <mark>还有内核进程呢！</mark><br />B. 可重入代码中一般不能使用全局变量<br />C. 在多道程序下，共享可重入代码可以减少程序对内存的占用<br />D. 可重入代码中一般不能使用静态变量<br />【答案】A、B、C、D</p></li></ol><blockquote><ol><li>若一个用户进程通过read系统调用读取一个磁盘文件中的数据，则下列关于此过程的叙述中，正确的是  A   。</li></ol><p>Ⅰ、若该文件的数据不在内存，则该进程进入阻塞状态</p><p>Ⅱ、请求read系统调用会使CPU从用户态切换到核心态</p><p>Ⅲ、 read系统调用的参数应包含文件的名称</p><p>A. 仅Ⅰ、Ⅱ    B. 仅Ⅰ、Ⅲ  C. 仅Ⅱ、Ⅲ   D. Ⅰ、Ⅱ和Ⅲ</p></blockquote><p>首先要用open系统调用打开该文件。open中的参数包括文件的路径名和文件名，而read只需使用open返回的文件描述符，并不使用文件名作为参数。</p><p>read要求用户提供三个输入参数：</p><ul><li>文件描述符fd</li><li>buf缓冲区首址</li><li>传送的字节数n</li></ul><p>read的功能是试图从fd所指示的文件中读入n个字节的数据，并将它们送至由指针buf所指示的缓冲区中</p><h3 id="算法相关"><a class="markdownIt-Anchor" href="#算法相关"></a> 算法相关</h3><h4 id="寻找空闲分区"><a class="markdownIt-Anchor" href="#寻找空闲分区"></a> 寻找空闲分区</h4><h6 id="分配算法基于顺序搜索-2"><a class="markdownIt-Anchor" href="#分配算法基于顺序搜索-2"></a> 分配算法（基于顺序搜索）</h6><ul><li>首次适应：按<mark>地址递增</mark>顺序排序，选择第一个满足要求的。空闲分区以地址递增的次序排列，按顺序查找空闲分区链&amp;表。<ul><li>低地址不断划分，出现小碎片。</li><li>每次从低地址开始，增加查找可用分区的开销。</li></ul></li><li>下次适应：循环列表，从上次查找结束的地方开始。以地址递增的循环列表。<ul><li>空间利用更加均衡，不会非小的集中在一端。缺乏大的空闲分区。</li></ul></li><li>最佳适应：选择大小最接近的。按容量递增次序排列。<ul><li>小碎片。</li></ul></li><li>最坏适应：寻找最大的空闲区。按容量递减次序排列。<ul><li>大作业申请得不到满足。</li></ul></li></ul><h6 id="分配算法基于索引-2"><a class="markdownIt-Anchor" href="#分配算法基于索引-2"></a> 分配算法（基于索引）</h6><p>适合小系统，否则空闲分区表/链很大，检索速度慢。</p><ul><li>快速适应：按容量大小分类，常用大小的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。<ul><li>效率高，仅需要根据程序长度，找到能容纳最小空闲区链表，取下第一块。</li><li>不会分割分区，不产生内存碎片。取下某链表第一个即可。</li><li>回收算法复杂。</li></ul></li><li>伙伴系统：（linux）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>&lt;</mo><mi>x</mi><mo>&lt;</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^{n-1}&lt;x&lt;2^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.853208em;vertical-align:-0.0391em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.664392em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>，如果找不到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.664392em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>就找<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">2^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span>再切割成两个相等的（伙伴）。<ul><li>两个块合并成一个更大的块，首地址必须是块大小的整数倍</li><li>伙伴地址： 两个大小相同的相邻块合并成一个更大的块时，<strong>首地址必须是块（合成后的块2倍）大小的整数倍</strong>。</li></ul></li></ul><h4 id="页面置换-2"><a class="markdownIt-Anchor" href="#页面置换-2"></a> 页面置换</h4><ul><li>最优置换：选择最长时间不需要访问的页面。（用于比较性研究）</li><li>先进先出：选择在主存驻留时间最长的一页淘汰（queue）。<ul><li>性能较差，Belady异常（分配的页框增多，缺页率反而提高）</li></ul></li><li>改进的FIFO算法（second chance）：如果被淘汰的数据之前被访问过，则给第二次机会，同时清除标志位，否则直接淘汰。</li><li>改进的FIFO算法（clock）：环形循环指针。<ul><li>无缺页错误：将访问页置1，指针不动</li><li>产生：<ul><li>当前为1：置0，向前移，直至找到0</li><li>当前为0：替换，将其置1，向前移一位</li></ul></li></ul></li><li>最近最少使用LRU：选择在最近一段时间内最久不用的页面。<ul><li>命中时：所有块的计数值与命中块的计数值比较，<ul><li><p>如果某块计数值小于命中块的计数值， 则该块的计数值加 1</p></li><li><p>如果该块的计数值大于命中块的计数值，则数值不变。</p></li><li><p>最后将命中块的计数器清为0。</p></li></ul></li><li>访问未命中：计数值最大的块被替换。被替换的清0，其余加1.</li></ul></li><li>工作集算法：工作集指进程运行正在使用的页面集合。给定一个进程，记录其工作集。当需要进行页面替换时，选择不在工作集中的页面进行替换。</li></ul><h3 id="混淆区分"><a class="markdownIt-Anchor" href="#混淆区分"></a> 混淆区分</h3><ul><li>交换分区：<strong>磁盘</strong>。将OS暂时不用的数据放在这里。</li><li>块高速缓存：<strong>内存</strong>。相当于虚拟存储的cache。</li><li>页缓冲：<strong>内存</strong>。发生缺页中断时，不必首先写出置换页，而是将被选中的置换页面暂时保留在内存的缓冲区，批量写出到外存。减少IO次数。</li><li>输入井和输出井：<strong>磁盘</strong>。模拟脱机输入输出</li></ul><h2 id="计算题"><a class="markdownIt-Anchor" href="#计算题"></a> 计算题</h2><h3 id="内存管理-2"><a class="markdownIt-Anchor" href="#内存管理-2"></a> 内存管理</h3><p><strong>注意是大尾端还是小尾端，多少位！！！</strong></p><h3 id="同步与互斥-2"><a class="markdownIt-Anchor" href="#同步与互斥-2"></a> 同步与互斥</h3><p>大题：</p><p>初始化信号量semaphore，其他变量（注意可不可以定义其他变量）</p><ul><li>分析同步互斥关系。</li><li>同步即先V后P，互斥全部加上PV。</li><li>互斥信号量初始值为1，同步要看资源的多少。</li><li>遇到数量，优先考虑初值为N 的信号量</li><li>读/写者优先中，“优先”也可以看作资源</li></ul><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">main()&#123;</span><br><span class="line">cobegin&#123;<span class="comment">//并发执行</span></span><br><span class="line">P1:&#123;</span><br><span class="line">            <span class="keyword">while</span>（<span class="literal">true</span>）&#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">P2:&#123;&#125;</span><br><span class="line">&#125;coend</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="习题"><a class="markdownIt-Anchor" href="#习题"></a> 习题</h4><blockquote><p>读者写者问题（写者优先）: 1）共享读; 2）互斥写、读写互斥; 3）写者优先于读者（一 旦有写者，则后续读者必须等待，唤醒时优先考虑写者）。</p></blockquote><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">semaphore rw=<span class="number">1</span>;<span class="comment">//读写互斥</span></span><br><span class="line"><span class="built_in">int</span> count=<span class="number">0</span>;<span class="comment">//记录进入读的进程数</span></span><br><span class="line">semaphore mutex=<span class="number">1</span>;<span class="comment">//互斥访问count变量</span></span><br><span class="line">semaphore r=<span class="number">1</span>;<span class="comment">//当有写进程时，禁止所有读进程</span></span><br><span class="line"><span class="built_in">int</span> writecount=<span class="number">1</span>;<span class="comment">//记录进入的写进程数</span></span><br><span class="line">semaphore mutex1=<span class="number">1</span>;<span class="comment">//互斥访问writecount变量</span></span><br><span class="line">semaphore mutex3=<span class="number">1</span>;<span class="comment">//用于只要有写进程读进程一直阻塞，但如果都在一个队列写进程不能跳过，所以读进程被阻塞在mutex3中</span></span><br><span class="line">main()&#123;</span><br><span class="line">    cobegin&#123;</span><br><span class="line">        Read:&#123;</span><br><span class="line">            <span class="keyword">while</span>(<span class="literal">true</span>)&#123;</span><br><span class="line">                P(mutex3);</span><br><span class="line">                P(r);</span><br><span class="line">                P(mutex);</span><br><span class="line">                <span class="keyword">if</span>(count==<span class="number">0</span>)&#123;</span><br><span class="line">                    P(rw);</span><br><span class="line">                &#125;</span><br><span class="line">                count++;</span><br><span class="line">                V(mutex);</span><br><span class="line">                V(r);</span><br><span class="line">                V(mutex3);</span><br><span class="line">                read;</span><br><span class="line">                P(mutex);</span><br><span class="line">                count--;</span><br><span class="line">                <span class="keyword">if</span>(count==<span class="number">0</span>)&#123;</span><br><span class="line">                    V(rw);</span><br><span class="line">                &#125;</span><br><span class="line">                V(mutex);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        Write:&#123;</span><br><span class="line">            <span class="keyword">while</span>(<span class="literal">true</span>)&#123;</span><br><span class="line">                P(mutex1);</span><br><span class="line">                <span class="keyword">if</span>(writecount==<span class="number">0</span>)&#123;</span><br><span class="line">                    P(r);</span><br><span class="line">                &#125;</span><br><span class="line">                writecount++;</span><br><span class="line">                V(mutex1);</span><br><span class="line">                P(rw);</span><br><span class="line">                write;</span><br><span class="line">                V(rw);</span><br><span class="line">            P(mutex1);</span><br><span class="line">                writecount--;</span><br><span class="line">                <span class="keyword">if</span>(writecount==<span class="number">0</span>)&#123;</span><br><span class="line">                    P(r);</span><br><span class="line">                &#125;</span><br><span class="line">                V(mutex1);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="作业调度"><a class="markdownIt-Anchor" href="#作业调度"></a> 作业调度</h3><h4 id="评价指标"><a class="markdownIt-Anchor" href="#评价指标"></a> 评价指标</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406051631318.png" alt="" /></p><p>响应比=1+S/T （S：等待时间；T：运行时间）</p><p>T(响应时间)=N(进程数目)*q(时间片) 数目越多，时间片越小</p><h4 id="算法内容"><a class="markdownIt-Anchor" href="#算法内容"></a> 算法内容</h4><ul><li><p>先来先服务FCFS（非抢占）</p></li><li><p>短作业优先SJF（非抢占）</p></li><li><p>最短剩余时间优先SRTN（抢占）</p></li><li><p>最高响应比优先HRRN（非抢占）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mi>P</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">已</mi><mi mathvariant="normal">等</mi><mi mathvariant="normal">待</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi><mi mathvariant="normal">/</mi><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">服</mi><mi mathvariant="normal">务</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi></mrow><annotation encoding="application/x-tex">RP=1+作业已等待时间/作业的服务时间</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">已</span><span class="mord cjk_fallback">等</span><span class="mord cjk_fallback">待</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span><span class="mord">/</span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">服</span><span class="mord cjk_fallback">务</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span></span></span></span></p></li><li><p>时间片轮转RR：所有就绪队列按照FCFS，刚用完时间片的排在队尾，<mark>刚出现的进程排在队首立即参与第一次调度</mark></p></li><li><p>优先级算法（抢占&amp;非抢占）</p></li><li><p>多级队列算法MQ：多个就绪队列，可有不同优先级，时间片长度</p></li><li><p>多级反馈队列MFQ：多个就绪队列，队列1优先级最高，优先级越低时间片越长，进程先到队列1，然后进入队列2，队列中FCFS。只有队列1为空才会调度队列2.</p></li><li><p>静态表调度：事先固定调度方案</p></li><li><p>单调速率调度RMS（静态，抢占）：任务周期越小优先级越高先被调度，优先级一样随机选择。判断任务集可调度（C为运行时间，T为周期）：<strong>注意周期，周期内运行完的不用再考虑了！</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mi>C</mi><mi>i</mi></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mo>≤</mo><mi>n</mi><mo stretchy="false">(</mo><mroot><mn>2</mn><mi>n</mi></mroot><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>≈</mo><mn>0.69</mn></mrow><annotation encoding="application/x-tex">\sum^n_{i=1}\frac{C_i}{T_i}\leq n(\sqrt[n]{2}-1)\approx0.69</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.206095em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mopen">(</span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738594em;"><span style="top:-3.023314em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.956095em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">2</span></span></span><span style="top:-2.916095em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.08390500000000001em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">9</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040017236.png" alt="" /></p></li><li><p>最早截止期优先EDF（抢占）：绝对截止时间越早优先。任务集可调度：<mark>计算出最小公倍数的周期情况</mark></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mfrac><msub><mi>C</mi><mi>i</mi></msub><msub><mi>T</mi><mi>i</mi></msub></mfrac><mo>≤</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\sum^n_{i=1}\frac{C_i}{T_i}\leq1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040020669.png" alt="" /></p></li></ul><h3 id="死锁-2"><a class="markdownIt-Anchor" href="#死锁-2"></a> 死锁</h3><h4 id="资源分配图-2"><a class="markdownIt-Anchor" href="#资源分配图-2"></a> 资源分配图</h4><h5 id="画"><a class="markdownIt-Anchor" href="#画"></a> 画</h5><ul><li>资源为方块，有几个资源里面就有几个圆。</li><li>进程为圆</li><li>申请资源（need）：进程-&gt;资源</li><li>已经分配（allocate）：资源-&gt;进程</li></ul><h5 id="化简"><a class="markdownIt-Anchor" href="#化简"></a> 化简</h5><ul><li>计算出所有资源的空闲量：总数-出度</li><li>看每个进程：如果请求边（进程的出边）&lt;=资源空闲量，删去所有边</li><li>重复1,2过程</li></ul><h4 id="银行家算法-2"><a class="markdownIt-Anchor" href="#银行家算法-2"></a> 银行家算法</h4><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406032227975.png" alt=""  /><table><thead><tr><th>进程号</th><th>work</th><th>allocation</th><th>need</th><th>work+alloc</th><th>finish</th></tr></thead><tbody><tr><td>P1</td><td>3 3 2</td><td>2 0 0</td><td>1 2 2</td><td>5 3 2</td><td>true</td></tr></tbody></table><p>如果<code>work&gt;=need</code>，即可完成该进程</p><h3 id="文件系统-2"><a class="markdownIt-Anchor" href="#文件系统-2"></a> 文件系统</h3><p><mark>文件名按顺序，读取目录项不一定顺序！！！</mark></p><h4 id="文件物理结构-2"><a class="markdownIt-Anchor" href="#文件物理结构-2"></a> 文件物理结构</h4><h5 id="连续结构"><a class="markdownIt-Anchor" href="#连续结构"></a> 连续结构</h5><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040026019.png" alt="" style="zoom:67%;" /><h5 id="串联链接结构"><a class="markdownIt-Anchor" href="#串联链接结构"></a> 串联/链接结构</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040032518.png" alt="" /></p><h5 id="索引结构-2"><a class="markdownIt-Anchor" href="#索引结构-2"></a> 索引结构</h5><p>inode：索引节点，存储文件或目录的属性信息和数据所在的物理块信息。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040958299.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406040036717.png" alt="" /></p><h4 id="计算文件大小"><a class="markdownIt-Anchor" href="#计算文件大小"></a> 计算文件大小</h4><p>直接索引：文件inode-&gt;索引表-&gt;数据块</p><p>一级及以上的索引表大小等同于数据块大小</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">块</mi><mi mathvariant="normal">大</mi><mi mathvariant="normal">小</mi><mo>×</mo><mo stretchy="false">(</mo><mi mathvariant="normal">直</mi><mi mathvariant="normal">接</mi><mi mathvariant="normal">索</mi><mi mathvariant="normal">引</mi><mi mathvariant="normal">数</mi><mo>+</mo><mi mathvariant="normal">一</mi><mi mathvariant="normal">级</mi><mi mathvariant="normal">索</mi><mi mathvariant="normal">引</mi><mi mathvariant="normal">数</mi><mo>×</mo><mfrac><mrow><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">块</mi></mrow><mrow><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">块</mi><mi mathvariant="normal">地</mi><mi mathvariant="normal">址</mi><mi mathvariant="normal">字</mi><mi mathvariant="normal">节</mi><mi mathvariant="normal">数</mi></mrow></mfrac><mo>+</mo><mi mathvariant="normal">二</mi><mi mathvariant="normal">级</mi><mi mathvariant="normal">索</mi><mi mathvariant="normal">引</mi><mi mathvariant="normal">数</mi><mo>×</mo><msup><mfrac><mrow><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">块</mi></mrow><mrow><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">块</mi><mi mathvariant="normal">地</mi><mi mathvariant="normal">址</mi><mi mathvariant="normal">字</mi><mi mathvariant="normal">节</mi><mi mathvariant="normal">数</mi></mrow></mfrac><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">数据块大小\times (直接索引数+一级索引数\times\frac{数据块}{数据块地址字节数}+二级索引数\times\frac{数据块}{数据块地址字节数}^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">块</span><span class="mord cjk_fallback">大</span><span class="mord cjk_fallback">小</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord cjk_fallback">直</span><span class="mord cjk_fallback">接</span><span class="mord cjk_fallback">索</span><span class="mord cjk_fallback">引</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">一</span><span class="mord cjk_fallback">级</span><span class="mord cjk_fallback">索</span><span class="mord cjk_fallback">引</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.363em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">块</span><span class="mord cjk_fallback">地</span><span class="mord cjk_fallback">址</span><span class="mord cjk_fallback">字</span><span class="mord cjk_fallback">节</span><span class="mord cjk_fallback">数</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">块</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">二</span><span class="mord cjk_fallback">级</span><span class="mord cjk_fallback">索</span><span class="mord cjk_fallback">引</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.567008em;vertical-align:-0.686em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">块</span><span class="mord cjk_fallback">地</span><span class="mord cjk_fallback">址</span><span class="mord cjk_fallback">字</span><span class="mord cjk_fallback">节</span><span class="mord cjk_fallback">数</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">块</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.881008em;"><span style="top:-3.1299em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><h4 id="读取文件"><a class="markdownIt-Anchor" href="#读取文件"></a> 读取文件</h4><h5 id="直接读取不说就是直接读取"><a class="markdownIt-Anchor" href="#直接读取不说就是直接读取"></a> 直接读取（不说就是直接读取）</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406041057210.png" alt="" /></p><blockquote><p>文件平均大小为100KB，磁盘物理块的大小为1KB，根目录的目录项已读入内存中，目标文件f在第三级目录下，且其对应的第三级目录的目录项可以一次从磁盘读出，访问文件f中的一个块平均需要访问几次磁盘？</p></blockquote><ul><li>直接从根目录目录项获得usr2的物理块号，一个磁盘块可以包含8个目录项，所以读取全部第三级目录项需要16次磁盘读取；平均需要 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>16</mn><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mn>2</mn><mo>=</mo><mn>8.5</mn></mrow><annotation encoding="application/x-tex">(1+16)/2=8.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">6</span><span class="mclose">)</span><span class="mord">/</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span><span class="mord">.</span><span class="mord">5</span></span></span></span></li><li>第三级目录的目录项可以一次读出，需要一次</li><li>访问文件f最少需要1次，最多需要100次，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>100</mn><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mn>2</mn><mo>=</mo><mn>50.5</mn></mrow><annotation encoding="application/x-tex">(1+100)/2=50.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mclose">)</span><span class="mord">/</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord">.</span><span class="mord">5</span></span></span></span></li><li>一共需要8.5+1+50.5=60</li></ul><blockquote><p>如果采用i节点的方法来构建文件目录，假定文件名占14个字节，i节点的指针占2个字节。如果仅采用直接索引，每个第三级目录下的文件数不超过50个，且根目录的i节点已读入内存，访问第三级目录下的一个文件的一个块平均需要访问几次磁盘？</p></blockquote><ul><li>通过根目录的inode读取根目录内容，1次；从而获得usr2的inode物理块号，读取usr2的inode，1次</li><li>读取usr目录内容，最多需要2次。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mn>2</mn><mo>=</mo><mn>1.5</mn></mrow><annotation encoding="application/x-tex">(1+2)/2=1.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mord">/</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord">5</span></span></span></span></li><li>获得了dx的inode的物理块号，读取需要1次，再读取dx的目录项需要1次；读取文件1次</li><li>一共需要1+1+1.5+1+1+1=6.5</li></ul><blockquote><p>假设该文件系统的空间最大容量为16ZB(1ZB=270B)。如果文件的 FCB 中包括512字节的索引区，且允许采用一级索引进行组织，那么该文件系统支持的最大文件是多少字节？</p></blockquote><p>数据块<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mn>64</mn></msup></mrow><annotation encoding="application/x-tex">2^{64}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span><span class="mord mtight">4</span></span></span></span></span></span></span></span></span></span></span></span>，需要64/8个字节。索引区存放64个磁盘号。一级索引。每个索引都指向一个索引表（1KB/8个一级索引）</p><p>文件最大为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>64</mn><mo>×</mo><mfrac><mrow><mn>1</mn><mi>K</mi><mi>B</mi></mrow><mn>8</mn></mfrac><mo>×</mo><mn>1</mn><mi>K</mi><mi>B</mi><mo>=</mo><mn>8</mn><mi>M</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">64\times \frac{1KB}{8}\times 1KB=8MB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">6</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.217331em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.872331em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span><span class="mord mathdefault mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord mathdefault" style="margin-right:0.07153em;">K</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">8</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></p><h5 id="inode方式读取"><a class="markdownIt-Anchor" href="#inode方式读取"></a> inode方式读取</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406041044413.png" alt="" /></p><ul><li>通过根目录inode获得根目录目录块块号，读取根目录内容，获得tmp目录的inode所在的物理块号</li><li>读取tmp的inode，获得tmp目录项所在的物理块号</li><li>读取tmp目录内容，获得hello的inode的物理块号</li><li>读取hello的inode，获得hello的物理块号</li><li>读取hello数据</li></ul><p>至少读取5次。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406041044898.png" alt="" /></p><h4 id="磁盘"><a class="markdownIt-Anchor" href="#磁盘"></a> 磁盘</h4><p><mark>单位统一</mark></p><p>寻道时间：把磁头从当前位置移动到指定刺刀上的时间。s（启动磁盘），n（移动磁道数）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>s</mi></msub><mo>=</mo><mi>m</mi><mo>×</mo><mi>n</mi><mo>+</mo><mi>s</mi></mrow><annotation encoding="application/x-tex">T_s=m\times n+s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">m</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span></span></p><p>旋转延迟时间：r（旋转速度RPM）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>r</mi></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mo>×</mo><mi>r</mi></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mo>×</mo><mi>R</mi><mi>P</mi><mi>M</mi><mo>×</mo><mn>60</mn></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_r=\frac{1}{2\times r}=\frac{1}{2\times RPM \times 60}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.09077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.09077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">6</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>传输时间：把数据从磁盘读出&amp;向磁盘写入数据。b（读写的字节数），r（旋转速度），N（磁道上的字节数）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>t</mi></msub><mo>=</mo><mfrac><mi>b</mi><mrow><mi>r</mi><mo>×</mo><mi>N</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_t=\frac{b}{r\times N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.14077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.37144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>总访问时间：寻道时间+旋转延迟时间+传输时间</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mi>a</mi></msub><mo>=</mo><msub><mi>T</mi><mi>s</mi></msub><mo>+</mo><mfrac><mn>1</mn><mrow><mn>2</mn><mi>r</mi></mrow></mfrac><mo>+</mo><mfrac><mi>b</mi><mrow><mi>r</mi><mi>N</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">T_a=T_s+\frac{1}{2r}+\frac{b}{rN}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.05744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.37144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><strong>注意一共要读取多少个块，乘几 传输时间的写字节数不一定等于读的。比如完整读三个数据块12KB，实际文件大小为10KB</strong></p><p><mark>所以传输时间分开加！不要跟着乘在里面！！！</mark></p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;p&gt;&lt;mark&gt;关于内存地址如何转化成存储空间大小&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;0x0000-0x1000，为&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;kate</summary>
      
    
    
    
    <category term="大二下" scheme="http://example.com/categories/%E5%A4%A7%E4%BA%8C%E4%B8%8B/"/>
    
    
    <category term="笔记" scheme="http://example.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="OS" scheme="http://example.com/tags/OS/"/>
    
  </entry>
  
  <entry>
    <title>数据库</title>
    <link href="http://example.com/2024/07/24/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    <id>http://example.com/2024/07/24/%E6%95%B0%E6%8D%AE%E5%BA%93/</id>
    <published>2024-07-24T15:50:10.000Z</published>
    <updated>2024-07-24T15:50:54.271Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1 id="01-数据管理基本概念"><a class="markdownIt-Anchor" href="#01-数据管理基本概念"></a> 01 数据管理基本概念</h1><p><strong>数据&amp;信息</strong></p><ul><li>数据：无意义。数据+解释=信息</li><li>信息：影响动态系统的状态的事件。</li></ul><h2 id="数据管理"><a class="markdownIt-Anchor" href="#数据管理"></a> 数据管理</h2><ul><li>数据定义</li><li>数据组织、存储、管理</li><li>数据操纵</li><li>数据库事务管理和运行管理</li><li>数据库的建立与维护</li></ul><h3 id="数据库系统"><a class="markdownIt-Anchor" href="#数据库系统"></a> 数据库系统</h3><p>由应用程序、数据库、数据库管理系统和用户组成。</p><ul><li>数据共享：不同用户使用数据重叠。</li><li>数据独立性：数据库中的数据与应用程序之间不存在依赖关系。<ul><li>物理独立性：数据库（从光盘挪到磁盘：物理层修改），程序不影响。</li><li>逻辑数据独立性：修改数据库的逻辑模式而不必重写应用程序的能力。</li></ul></li><li>方便的用户接口（SQL）</li><li>统一的数据管理与控制功能<ul><li>数据完整性：正确性，有效性和相容性。</li><li>数据安全性：主动安全（有效防止数据被非法使用&amp;修改），被动安全（遭到破坏可以完全恢复）</li><li>并发控制</li></ul></li></ul><h1 id="02-数据模型"><a class="markdownIt-Anchor" href="#02-数据模型"></a> 02 数据模型</h1><p>数据模型：是模型的一种，是现实世界数据特征的抽象，是用来描述数据的一组概念和定义。</p><h2 id="概念模型"><a class="markdownIt-Anchor" href="#概念模型"></a> 概念模型</h2><p>对现实世界的第一层抽象。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105441.png" alt="" /></p><p><strong>概念数据模型</strong></p><ul><li>是独立于计算机系统的数据模型，不涉及信息在计算机中的表示，只用来描述某个特定组织所关心的信息结构，是对现实世界的第一层抽象。</li><li>按用户的观点对数据建模，强调其语义表达能力，是用户和数据库设计人员之间进行交流的语言和工具。</li></ul><p>要求：强语义表达能力，方便直接的表达应用中的各种语义知识</p><h3 id="er数据模型"><a class="markdownIt-Anchor" href="#er数据模型"></a> ER数据模型</h3><p><mark>最常用的一种概念数据模型</mark></p><h4 id="抽象手段"><a class="markdownIt-Anchor" href="#抽象手段"></a> 抽象手段</h4><h5 id="分类"><a class="markdownIt-Anchor" href="#分类"></a> 分类</h5><ul><li>定义某一类感念作为现实世界中一组对象的类型。</li><li>在特定的上下文里，这些对象具有某些共同特性和行为。</li><li>大学里的学生，奥运会的赛事，公交公司的司机…</li></ul><h5 id="聚集"><a class="markdownIt-Anchor" href="#聚集"></a> 聚集</h5><ul><li>定义某一类型的组成成分</li><li>根据上下文管理需求，给出指定类型的特征集合</li><li>学生：学号、姓名、年龄等特征组成</li></ul><h4 id="基本元素"><a class="markdownIt-Anchor" href="#基本元素"></a> 基本元素</h4><ul><li>实体：客观存在并可以相互区分的客观事物或抽象事件。<mark>分类</mark><ul><li>实体集：同型实体的集合。</li></ul></li><li>属性：实体所具有的某一特性。<mark>聚集</mark><ul><li>域：是一组具有相同数据类型的值的集合</li><li>类型：<ul><li>简单属性：不可再分。eg：学号。</li><li>复合属性：可以划分更小的属性。eg：街道=家庭住址+门牌号码。</li><li>单值属性：每一个特定的实体在该属性上的取值唯一。</li><li>多值属性：特定实体在该属性上有多于一个的取值（eg：电话）</li></ul></li><li>键（key）：<ul><li>实体集中能唯一标识实体的属性或属性组称为实体集的键.</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>&gt;</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">&gt;2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>是复合键。</li></ul></li></ul></li><li>联系：笛卡尔积。</li></ul><h4 id="er图"><a class="markdownIt-Anchor" href="#er图"></a> ER图</h4><p>🍰 实体：矩形框</p><p>🍰 属性：椭圆框并用连线连到相应实体。</p><p>🍰 联系：菱形框并用连线与有关的实体相连。</p><p>联系的元：参与联系的实体的个数。</p><p>联系的基数比约束：1：1，1：n，m：n（谁是1那边谁标1：领导1工人n）</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105960.png" alt="" style="zoom:80%;" /><p><font color='purple'><strong>多元联系中使用箭头——知道了其他几种就可以确定箭头指向的信息：</strong></font></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406232236040.png" alt="" style="zoom:50%;" /><h4 id="约束"><a class="markdownIt-Anchor" href="#约束"></a> 约束</h4><p>约束：数据库的断言（对插入数据库中的数据进行限定）</p><blockquote><p>非空约束，唯一值约束，主键约束，外键约束，Check约束</p></blockquote><h5 id="键约束"><a class="markdownIt-Anchor" href="#键约束"></a> 键约束</h5><p>超键：是实体集中的一个或一组属性，可以唯一的确定每一个实体。</p><p>候选键：某个超键的最小集。</p><p>存在多个候选键，可以任选一个作为主键。</p><h4 id="建模准则"><a class="markdownIt-Anchor" href="#建模准则"></a> 建模准则</h4><p><mark>能抽象为属性的，就不要抽象为实体</mark>。符合以下之一才被抽象为实体：</p><ul><li>至少一个非键属性。</li><li>处于“一对多”或“多对多”联系中“多”那一端。</li></ul><h2 id="逻辑模型"><a class="markdownIt-Anchor" href="#逻辑模型"></a> 逻辑模型</h2><p>对现实世界的第二层抽象，与DBMS有关。</p><ul><li>直接面向数据库的逻辑结构,是对现实世界的第二层抽象。它直接与DBMS有关,有严格的形式化定义,以便在计算机系统中实现。</li><li>有一组严格定义的无二义性语法和语义的DB语言</li><li>层次模型、网状模型、关系模型等</li><li><mark>是区分不同类型数据库的依据，很大程度上决定了数据库的性能和应用范围</mark></li></ul><p>通常所说的数据模型就是逻辑数据模型</p><p>三要素：数据结构，数据操作和数据约束。</p><h2 id="物理模型"><a class="markdownIt-Anchor" href="#物理模型"></a> 物理模型</h2><ul><li>反映了数据在存储介质上的组成结构，并描述了访问机制</li><li>如何表达记录结构、记录顺序和访问路径等信息</li></ul><h1 id="03-关系模型"><a class="markdownIt-Anchor" href="#03-关系模型"></a> 03 关系模型</h1><p>逻辑数据结构三要素：<strong>数据结构、数据操作和数据约束</strong>。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105662.png" alt="" /></p><p>关系模型：二维表格结构表示实体及实体之间的联系的模型。<strong>对关系的数学理论描述</strong></p><p>关系模式：<strong>对关系的结构描述</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241044256.jpeg" alt="watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDliqrlipvlpYvmlpfnmoTlvKDlkIzlraY,size_20,color_FFFFFF,t_70,g_se,x_16" /></p><h2 id="关系数据结构"><a class="markdownIt-Anchor" href="#关系数据结构"></a> 关系数据结构</h2><p>关系与关系间有公共属性，说明两个关系有联系。</p><p>只要把的所有的实体及其属性用关系框架来表示，同时把实体之间的关系也用关系框架来表示，就可以得到一个关系模型。</p><h3 id="性质"><a class="markdownIt-Anchor" href="#性质"></a> 性质</h3><ul><li><p>不能出现相同元组（笛卡尔积每一个元素叫做一个n元组，即关系表的一行）</p></li><li><p>关系中元组的顺序（即行序）无关紧要。</p></li><li><p>属性的顺序也无关紧要，应连同属性名一起交换。</p></li><li><p>统一属性名下的个属性必须来自同一个域，是同一类型的数据。</p></li><li><p>关系中各个属性必须有不同的名字，不同的属性可来自同一个域，即它们的分量可以取自同一个域。（eg：职业&amp;兼职）</p></li><li><p>每一分量必须是不可分的数据项。所有属性值都是原子的，是一个确定的值，而不是值的集合。不可“表中有表”。满足此条件的关系称为<font color='Fswf'>规范化关系</font>，否则称为<font color='Fswf'>非规范化关系</font>。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105268.png" alt="" /></p></li></ul><h3 id="er模型向关系模型转化"><a class="markdownIt-Anchor" href="#er模型向关系模型转化"></a> ER模型向关系模型转化</h3><h4 id="实体类型转换"><a class="markdownIt-Anchor" href="#实体类型转换"></a> 实体类型转换</h4><p>每个实体类型转换成一个关系模式，实体的属性即为关系模式的属性，实体标识符即为关系模式的键。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105883.png" alt="" /></p><h4 id="二元联系类型的转换"><a class="markdownIt-Anchor" href="#二元联系类型的转换"></a> 二元联系类型的转换</h4><ul><li><p>m：n</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106369.png" alt="" /></p></li><li><p>1：n：直接合并。将1合并到n端。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106308.png" alt="" /></p></li></ul><h2 id="关系的完整性"><a class="markdownIt-Anchor" href="#关系的完整性"></a> 关系的完整性</h2><ul><li>域完整性<ul><li>属性值应符合域的取值范围，增强数据类型</li><li><mark>对是否为NULL也是域完整性约束的一部分</mark></li></ul></li><li>实体完整性<ul><li>主键（非空，取值唯一）</li></ul></li><li>参照完整性<ul><li>外键：关系与关系之间的引用（空值|等于被参照关系中某个元组的主键值）</li></ul></li><li>用户定义的完整性：对某一具体关系数据库的约束条件。</li></ul><h2 id="关系代数"><a class="markdownIt-Anchor" href="#关系代数"></a> 关系代数</h2><p><mark>查询的条件要使用关系运算表达式来表示</mark></p><ul><li>运算对象：关系。</li><li>运算结果：关系。</li><li>运算符：四类。</li></ul><p><font color='red'>基本运算：集合并、集合差、广义笛卡儿积、选择、投影</font></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106540.png" alt="" /></p><h3 id="集合运算符"><a class="markdownIt-Anchor" href="#集合运算符"></a> 集合运算符</h3><p><mark>行的角度</mark></p><p>并交差运算：必须是相容的：</p><ul><li>关系R和S同元，属性数目必须相同。</li><li>对于所有i，R的第i格属性的域必须和S的第i个属性的域相同。</li></ul><p>广义笛卡尔积：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106403.png" alt="" /></p><p>交运算：</p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>∩</mo><mi>S</mi><mo>=</mo><mi>R</mi><mo>−</mo><mo stretchy="false">(</mo><mi>R</mi><mo>−</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R\cap S=R-(R-S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span></p><h3 id="专门的关系运算符"><a class="markdownIt-Anchor" href="#专门的关系运算符"></a> 专门的关系运算符</h3><p><mark>行和列的方向同时选择</mark></p><p><strong>选择</strong>：选择某些元组形成一个新的关系。（选择符合条件的行/元组）</p><p>\sigma_{F}(R)=\{t|t\in R \and F(t)=true \}。R是关系名，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span>是选择运算符，F是逻辑表达式。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106391.png" alt="" /></p><p><strong>投影</strong>：选择指定的属性，形成一个可能含有重复行的表格，删除重复行形成新关系。（投影可改变关系的属性次序，新关系与原关系不相容）</p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>π</mi><mi>A</mi></msub><mo stretchy="false">(</mo><mi>R</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">{</mo><mi>r</mi><mi mathvariant="normal">.</mi><mi>A</mi><mi mathvariant="normal">∣</mi><mi>r</mi><mo>∈</mo><mi>R</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\pi_A(R)=\{r.A|r\in R\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord">.</span><span class="mord mathdefault">A</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">}</span></span></span></span>，R是关系名，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>π</mi></mrow><annotation encoding="application/x-tex">\pi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">π</span></span></span></span>是投影运算符，A是被投影的属性或属性集</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106240.png" alt="" /></p><p><strong>连接</strong>：两个表之间的运算，一对多联系的父子关系。一般是由参照关系的外键和被参照关系的主键控制。</p>R \underset{A\theta B}\bowtie S=\{t|t=<r,s>\and r\in R\and s\in S\and r[A]\ \theta\ s[B]\}<p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106746.png" alt="" /></p><ul><li><p>自然连接：从两个关系的广义笛卡儿积中选取在相同属性列上取值相等的元组，并去掉重复的属性列。特殊的等值连接。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106781.png" alt="" /></p></li><li><p>外连接：自然连接 + 失配的元组。<img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221106453.png" alt="" /></p></li><li><p>自连接：两张一模一样的表连接。</p></li></ul><p><strong>除</strong>：至少。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>÷</mo><mi>S</mi><mo>=</mo><msub><mi>π</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>R</mi><mo stretchy="false">)</mo><mo>−</mo><msub><mi>π</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mo stretchy="false">(</mo><msub><mi>π</mi><mi>x</mi></msub><mo stretchy="false">(</mo><mi>R</mi><mo stretchy="false">)</mo><mo>×</mo><mi>S</mi><mo stretchy="false">)</mo><mo>−</mo><mi>R</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R \div S=\pi_{x}(R)-\pi_{x}((\pi_{x}(R)\times S)-R)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</span></span></span></span>.</p><p><mark>即所有满足被除项的判断，排除不在被除项的属性</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406222030556.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406222031235.png" alt="" /></p><h1 id="04-sql语言"><a class="markdownIt-Anchor" href="#04-sql语言"></a> 04 SQL语言</h1><h2 id="查询语言"><a class="markdownIt-Anchor" href="#查询语言"></a> 查询语言</h2><h3 id="单表查询"><a class="markdownIt-Anchor" href="#单表查询"></a> 单表查询</h3><h4 id="选择列"><a class="markdownIt-Anchor" href="#选择列"></a> 选择列</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Sno,Sname <span class="keyword">FROM</span> Student;</span><br></pre></td></tr></table></figure><h4 id="查询经计算的值"><a class="markdownIt-Anchor" href="#查询经计算的值"></a> 查询经计算的值</h4><ul><li><p><code>LOWER(Sdept)</code>：将所有字母小写。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Sname,<span class="number">2022</span><span class="operator">-</span>Sage,<span class="built_in">LOWER</span>(Sdept) <span class="keyword">FROM</span> Student;</span><br></pre></td></tr></table></figure></li><li><p>使用列别名改变查询结果的列标题：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Sname <span class="keyword">AS</span> NAME，<span class="string">&#x27;Year of Birth: &#x27;</span> <span class="keyword">AS</span> BIRTH，</span><br><span class="line"><span class="number">2022</span><span class="operator">-</span>Sage <span class="keyword">AS</span> BIRTHDAY，<span class="built_in">LOWER</span>(Sdept) <span class="keyword">AS</span> DEPARTMENT <span class="keyword">FROM</span> Student；</span><br></pre></td></tr></table></figure></li></ul><h4 id="选择元组"><a class="markdownIt-Anchor" href="#选择元组"></a> 选择元组</h4><ul><li><p>保留重复行（ALL，可省略）。消除取值重复的行（DISTINCT）<mark>DISTINCT短语的作用范围是所有目标列，放在属性的最前面！！！</mark></p></li><li><p>查询满足条件的元组：where。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">WHERE</span> Sdept <span class="keyword">IN</span>(<span class="string">&#x27;IS&#x27;</span>,<span class="string">&#x27;MA&#x27;</span>,<span class="string">&#x27;CS&#x27;</span>);</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406071518311.png" alt="" /></p><ul><li><p><code>between ... and ...</code>（<strong>包括边界</strong>）：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sanme <span class="keyword">from</span> student <span class="keyword">where</span> sage <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">23</span>;</span><br></pre></td></tr></table></figure></li><li><p>字符串匹配：</p><p>%任意长度（可以为0）的字符串，_单个字符。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">WHERE</span> <span class="operator">&lt;</span>Attribute<span class="operator">&gt;</span> <span class="keyword">LIKE</span> <span class="operator">&lt;</span><span class="keyword">pattern</span><span class="operator">&gt;</span>;</span><br></pre></td></tr></table></figure><p>查询中本身含有%or_，使用ESCAPE。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">WHERE</span> Cname <span class="keyword">LIKE</span> <span class="string">&#x27;DB\_Design&#x27;</span> <span class="keyword">ESCAPE</span> ‘\<span class="string">&#x27;;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>涉及空值的查询（任意与NULL比较结果都为Unknown）</p><p>三值逻辑计算：TRUE = 1, FALSE = 0, and UNKNOWN = ½。AND = MIN; OR = MAX, NOT(<em>x</em>) = 1-<em>x</em>、</p><p><code>IS NULL</code>：是空值。</p></li></ul><h4 id="排序"><a class="markdownIt-Anchor" href="#排序"></a> 排序</h4><p>ASC：升序。空值最后显示。</p><p>DESC：降序。空值最先显示。</p><h3 id="聚集和分组"><a class="markdownIt-Anchor" href="#聚集和分组"></a> 聚集和分组</h3><h4 id="聚集-2"><a class="markdownIt-Anchor" href="#聚集-2"></a> 聚集</h4><p>空值不加入计算。</p><ul><li><p>计数 COUNT（[DISTINCT|ALL] &lt;列名&gt; | *）</p></li><li><p>计算总和 SUM （[DISTINCT|ALL] &lt;列名&gt;）</p></li><li><p>计算平均值 AVG（[DISTINCT|ALL] &lt;列名&gt;）</p></li><li><p>求最大值 MAX（[DISTINCT|ALL] &lt;列名&gt;）</p></li><li><p>求最小值 MIN（[DISTINCT|ALL] &lt;列名&gt;）</p></li></ul><h4 id="group-by"><a class="markdownIt-Anchor" href="#group-by"></a> GROUP BY</h4><p>对每一个组进行集操作。</p><h4 id="having"><a class="markdownIt-Anchor" href="#having"></a> Having</h4><p><mark>只有满足HAVING短语指定条件的组才输出</mark></p><p>HAVING短语与WHERE子句的区别：作用对象不同。</p><ul><li>WHERE子句作用于基表或视图，从中选择满足条件的元组。<mark>不能使用集函数</mark></li><li>HAVING短语作用于组，从中选择满足条件的组。<mark>可以使用集函数</mark></li></ul><p>HAVING子句中出现的列只能是在group by子句或集函数中出现的列。</p><h3 id="多表查询"><a class="markdownIt-Anchor" href="#多表查询"></a> 多表查询</h3><h4 id="连接查询"><a class="markdownIt-Anchor" href="#连接查询"></a> 连接查询</h4><h5 id="笛卡尔积"><a class="markdownIt-Anchor" href="#笛卡尔积"></a> 笛卡尔积</h5><p>也可以不带连接谓词。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Student.<span class="operator">*</span>,SC.<span class="operator">*</span> <span class="keyword">FROM</span> Student <span class="keyword">CROSS</span> <span class="keyword">JOIN</span> SC;</span><br></pre></td></tr></table></figure><h5 id="等值连接"><a class="markdownIt-Anchor" href="#等值连接"></a> 等值连接</h5><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Student.sno,sname,cno <span class="keyword">FROM</span> Student ,SC <span class="keyword">WHERE</span> Student.Sno<span class="operator">=</span>SC.Sno;</span><br></pre></td></tr></table></figure><p>自然连接：等值连接特殊情况。把目标列中重复的属性列去掉。</p><p>自连接：一个表与自己连接。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> FIRST.Cno，SECOND.Cpno <span class="keyword">FROM</span> Course <span class="keyword">AS</span> <span class="keyword">FIRST</span>，Course <span class="keyword">AS</span> <span class="keyword">SECOND</span> <span class="keyword">WHERE</span> FIRST.Cpno <span class="operator">=</span> SECOND.Cno；</span><br></pre></td></tr></table></figure><h3 id="子查询"><a class="markdownIt-Anchor" href="#子查询"></a> 子查询</h3><p>在FROM中嵌套查询语句，但不能order！</p><p><strong>子查询中不能使用order by</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> Sname <span class="keyword">FROM</span> Student <span class="keyword">WHERE</span> Sno <span class="keyword">IN</span>(SELECTSno <span class="keyword">FROM</span> SC <span class="keyword">WHERE</span> Cno<span class="operator">=</span><span class="string">&#x27;2&#x27;</span>);</span><br></pre></td></tr></table></figure><h4 id="带in谓词的子查询"><a class="markdownIt-Anchor" href="#带in谓词的子查询"></a> 带IN谓词的子查询</h4><p>查询与刘晨在同一个系学习的学生：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sno,sname,sdept <span class="keyword">from</span> student <span class="keyword">where</span> sdept <span class="keyword">in</span> (<span class="keyword">select</span> sdept <span class="keyword">from</span> student <span class="keyword">where</span> sname<span class="operator">=</span><span class="string">&#x27;刘晨&#x27;</span>)</span><br></pre></td></tr></table></figure><p>如果能确切知道内层查询返回单值时，可使用比较运算符，比如上面句子可把IN改为=。</p><p><strong><mark>子查询一定跟在比较符后面</mark></strong></p><h4 id="带有any或all谓词的子查询"><a class="markdownIt-Anchor" href="#带有any或all谓词的子查询"></a> 带有ANY或ALL谓词的子查询</h4><ul><li>ANY：任意一个值</li><li>ALL：所有值</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406222316337.png" alt="" /></p><p>查询其他系中比信息系任意一个（其中某一个）学生年龄小的学生姓名和年龄：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sname,sage <span class="keyword">from</span> student <span class="keyword">where</span> sage<span class="operator">&lt;</span><span class="keyword">any</span>(<span class="keyword">select</span> sage <span class="keyword">from</span> student <span class="keyword">where</span> sdept<span class="operator">=</span><span class="string">&#x27;IS&#x27;</span>) <span class="keyword">and</span> sdept<span class="operator">!=</span><span class="string">&#x27;IS&#x27;</span>;</span><br></pre></td></tr></table></figure><p><strong>用集函数实现子查询通常比直接用ANY或ALL查询效率要高</strong>：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406222320867.png" alt="" /></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sname,sage <span class="keyword">from</span> student <span class="keyword">where</span> sage<span class="operator">&lt;</span>(<span class="keyword">select</span> <span class="built_in">max</span>(sage) <span class="keyword">from</span> student <span class="keyword">where</span> sdept<span class="operator">=</span><span class="string">&#x27;IS&#x27;</span>)<span class="keyword">and</span> sdept<span class="operator">!=</span><span class="string">&#x27;IS&#x27;</span>;</span><br></pre></td></tr></table></figure><h4 id="带有exists谓词的子查询"><a class="markdownIt-Anchor" href="#带有exists谓词的子查询"></a> 带有EXISTS谓词的子查询</h4><p>查询所有选修了1号课程的学生姓名</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sname <span class="keyword">from</span> student <span class="keyword">where</span> <span class="keyword">exists</span>(<span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> sc <span class="keyword">where</span> sno<span class="operator">=</span>student.sno <span class="keyword">and</span> cno<span class="operator">=</span><span class="string">&#x27;1&#x27;</span>);</span><br></pre></td></tr></table></figure><h3 id="集合查询"><a class="markdownIt-Anchor" href="#集合查询"></a> 集合查询</h3><p>并：UNION。交：INTERSECT。差：EXCEPT。</p><h2 id="ddl语言"><a class="markdownIt-Anchor" href="#ddl语言"></a> DDL语言</h2><h3 id="基本表"><a class="markdownIt-Anchor" href="#基本表"></a> 基本表</h3><h4 id="定义表"><a class="markdownIt-Anchor" href="#定义表"></a> 定义表</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> <span class="operator">&lt;</span>table_name<span class="operator">&gt;</span>(</span><br><span class="line"><span class="operator">&lt;</span>列名<span class="operator">&gt;</span> <span class="operator">&lt;</span>数据类型<span class="operator">&gt;</span>[<span class="operator">&lt;</span>列级完整性约束条件<span class="operator">&gt;</span>],</span><br><span class="line">....</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p>列级完整性约束条件：</p><ul><li><code>not null</code>：非空。</li><li><code>unique</code>：取值唯一。</li><li><code>primary key</code>：主键约束。</li><li><code>references</code>：参照完整性约束。</li></ul><p>数据类型：</p><ul><li><code>char(4)</code>：定长字符串。</li><li><code>varchar(n)</code>：变长字符串，n为字符串最大长度。</li></ul><h4 id="删除表"><a class="markdownIt-Anchor" href="#删除表"></a> 删除表</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> student;</span><br></pre></td></tr></table></figure><h4 id="修改表"><a class="markdownIt-Anchor" href="#修改表"></a> 修改表</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> <span class="operator">&lt;</span>table_name<span class="operator">&gt;</span></span><br><span class="line">[<span class="keyword">add</span> <span class="operator">&lt;</span>新列名<span class="operator">&gt;</span> <span class="operator">&lt;</span>数据类型<span class="operator">&gt;</span> [完整性约束]]</span><br><span class="line">[<span class="keyword">drop</span> <span class="operator">&lt;</span>完整性约束名<span class="operator">&gt;</span>]</span><br><span class="line">[modify <span class="operator">&lt;</span>列名<span class="operator">&gt;</span>  <span class="operator">&lt;</span>数据类型<span class="operator">&gt;</span>]</span><br></pre></td></tr></table></figure><p>add：增加心列和新的完整性约束条件。</p><p>drop：删除指定的列或完整性约束条件。</p><p>modify：修改列名和数据类型。</p><h2 id="dml语言"><a class="markdownIt-Anchor" href="#dml语言"></a> DML语言</h2><h3 id="插入"><a class="markdownIt-Anchor" href="#插入"></a> 插入</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> <span class="operator">&lt;</span>table_name<span class="operator">&gt;</span> [(key1,key2...)] <span class="keyword">values</span> (value1,value2...);</span><br></pre></td></tr></table></figure><p>没提到的属性取空值。</p><p>插入子查询的结果：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> deptage(sdept,avgage) <span class="keyword">values</span></span><br><span class="line"><span class="keyword">select</span> sdept,<span class="built_in">avg</span>(sage)</span><br><span class="line"><span class="keyword">from</span> student</span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> sdept;</span><br></pre></td></tr></table></figure><h3 id="更新"><a class="markdownIt-Anchor" href="#更新"></a> 更新</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">update</span> <span class="operator">&lt;</span>table_name<span class="operator">&gt;</span> <span class="keyword">set</span> key1<span class="operator">=</span>value1,key2<span class="operator">=</span>value2...where <span class="operator">&lt;</span>conditions<span class="operator">&gt;</span>;</span><br></pre></td></tr></table></figure><p>计算机系全体学生成绩清零（子查询）：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">update</span> sc <span class="keyword">set</span> grade<span class="operator">=</span><span class="number">0</span></span><br><span class="line"><span class="keyword">where</span> <span class="string">&#x27;cs&#x27;</span><span class="operator">=</span></span><br><span class="line">(<span class="keyword">select</span> sdept <span class="keyword">from</span> student <span class="keyword">where</span> student.sno<span class="operator">=</span>sc.sno);</span><br></pre></td></tr></table></figure><h3 id="删除"><a class="markdownIt-Anchor" href="#删除"></a> 删除</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">delete</span> <span class="keyword">from</span> <span class="operator">&lt;</span>table_name<span class="operator">&gt;</span> <span class="keyword">where</span> <span class="operator">&lt;</span>conditions<span class="operator">&gt;</span>;</span><br></pre></td></tr></table></figure><h2 id="dcl语言"><a class="markdownIt-Anchor" href="#dcl语言"></a> DCL语言</h2><h2 id="视图"><a class="markdownIt-Anchor" href="#视图"></a> 视图</h2><p>一种虚表，从一个或几个基本表/视图中导出的表，在数据字典中存储的是一条select语句。</p><p><strong>带表达式的视图必须明确定义组成视图的各个属性列名</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">view</span> is_student[列名<span class="number">1</span>，列名<span class="number">2.</span>.]</span><br><span class="line"><span class="keyword">as</span></span><br><span class="line"><span class="keyword">select</span> sno,sname,sage</span><br><span class="line"><span class="keyword">from</span> student</span><br><span class="line"><span class="keyword">where</span> sdept<span class="operator">=</span><span class="string">&#x27;is&#x27;</span>;</span><br></pre></td></tr></table></figure><blockquote><p>DBMS在执行create view语句时只是把视图的定义存入数据字典，并没有执行select</p></blockquote><p>对于可更新视图，可以对视图执行数据更新操作，数据库会根据视图定义去更新对应的基本表数据</p><p>不建议以<code>select *</code>方式创建视图，可延展性差（基表被破坏后，视图不能正常工作）</p><h1 id="05-数据库编程"><a class="markdownIt-Anchor" href="#05-数据库编程"></a> 05 数据库编程</h1><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406071522709.png" alt="" /></p><ul><li>数据库内部应用：效率高，适用于例行的数据分析维护功能</li><li>数据库外部应用：开发灵活，功能与可移植性更强</li></ul><h2 id="数据库内部编程"><a class="markdownIt-Anchor" href="#数据库内部编程"></a> 数据库内部编程</h2><h3 id="存储过程"><a class="markdownIt-Anchor" href="#存储过程"></a> 存储过程</h3><p>多次重复使用的代码编写成过程。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> <span class="operator">&lt;</span>procedure_name<span class="operator">&gt;</span>(</span><br><span class="line">[<span class="keyword">in</span><span class="operator">/</span><span class="keyword">out</span><span class="operator">/</span><span class="keyword">inout</span>]param_name type[,...]</span><br><span class="line">)</span><br><span class="line">[<span class="keyword">begin</span>]</span><br><span class="line">sql_statement</span><br><span class="line">[<span class="keyword">end</span>]</span><br></pre></td></tr></table></figure><p><code>in</code>输入参数，<code>out</code>输出参数，<code>inout</code>输入输出参数，既表示调用者向过程传入值，又表示过程向调用者传出值。</p><blockquote><p>eg:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> mypro(<span class="keyword">in</span> a <span class="type">int</span>,<span class="keyword">in</span> b <span class="type">int</span>,<span class="keyword">out</span> sum <span class="type">int</span>) </span><br><span class="line"><span class="keyword">begin</span> </span><br><span class="line"><span class="keyword">set</span> sum <span class="operator">=</span> a<span class="operator">+</span>b; </span><br><span class="line"><span class="keyword">end</span>;</span><br></pre></td></tr></table></figure></blockquote><p>删除：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">drop</span> <span class="keyword">procedure</span> procedure_name</span><br></pre></td></tr></table></figure><p>激活存储过程的执行：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> procedure_name(param_name type[,...])</span><br></pre></td></tr></table></figure><h4 id="变量"><a class="markdownIt-Anchor" href="#变量"></a> 变量</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DECLARE</span> variable_name [,variable_name...] datatype [<span class="keyword">DEFAULT</span> <span class="keyword">value</span>];</span><br></pre></td></tr></table></figure><p><code>datatype</code>MYSQL的数据类型，<code>default</code>声明默认值。</p><p>eg：<code>declare name varchar(20) default ‘jack’</code></p><p>变量赋值：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SET</span> 变量名 <span class="operator">=</span> 表达式值 [,variable_name <span class="operator">=</span> expression ...]</span><br></pre></td></tr></table></figure><h4 id="流程控制"><a class="markdownIt-Anchor" href="#流程控制"></a> 流程控制</h4><h5 id="if"><a class="markdownIt-Anchor" href="#if"></a> if</h5><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">if num<span class="operator">&lt;</span><span class="number">0</span> <span class="keyword">then</span> <span class="comment">-- 条件开始</span></span><br><span class="line"><span class="keyword">select</span> <span class="string">&#x27;负数&#x27;</span>;</span><br><span class="line">elseif num<span class="operator">=</span><span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"><span class="keyword">select</span> <span class="string">&#x27;不是正数也不是负数&#x27;</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">select</span> <span class="string">&#x27;正数&#x27;</span>;</span><br><span class="line"><span class="keyword">end</span> if;<span class="comment">-- 条件结束</span></span><br></pre></td></tr></table></figure><h5 id="case"><a class="markdownIt-Anchor" href="#case"></a> case</h5><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="comment">-- 条件开始</span></span><br><span class="line"><span class="keyword">when</span> num<span class="operator">&lt;</span><span class="number">0</span> <span class="keyword">then</span> <span class="keyword">select</span> <span class="string">&#x27;负数&#x27;</span>;</span><br><span class="line"><span class="keyword">when</span> num<span class="operator">=</span><span class="number">0</span> <span class="keyword">then</span> <span class="keyword">select</span> <span class="string">&#x27;不是正数也不是负数&#x27;</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">select</span> <span class="string">&#x27;正数&#x27;</span>;</span><br><span class="line"><span class="keyword">end</span> <span class="keyword">case</span>; <span class="comment">-- 条件结束</span></span><br></pre></td></tr></table></figure><h5 id="while"><a class="markdownIt-Anchor" href="#while"></a> while</h5><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">while num<span class="operator">&lt;</span><span class="number">10</span> do <span class="comment">-- 循环开始</span></span><br><span class="line"><span class="keyword">set</span> num <span class="operator">=</span> num<span class="operator">+</span><span class="number">1</span>;</span><br><span class="line"><span class="keyword">set</span> sum <span class="operator">=</span> sum<span class="operator">+</span>num;</span><br><span class="line"><span class="keyword">end</span> while; <span class="comment">-- 循环结束</span></span><br></pre></td></tr></table></figure><h5 id="repeat"><a class="markdownIt-Anchor" href="#repeat"></a> repeat</h5><p>类似<code>do...while</code></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">repeat<span class="comment">-- 循环开始</span></span><br><span class="line"><span class="keyword">set</span> num <span class="operator">=</span> num<span class="operator">+</span><span class="number">1</span>;</span><br><span class="line"><span class="keyword">set</span> sum <span class="operator">=</span> sum<span class="operator">+</span>num;</span><br><span class="line">until num<span class="operator">&gt;=</span><span class="number">10</span></span><br><span class="line"><span class="keyword">end</span> repeat;</span><br></pre></td></tr></table></figure><h5 id="loop"><a class="markdownIt-Anchor" href="#loop"></a> loop</h5><p><code>leave</code>相当于break，<code>iterate</code>相当于continue</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">loop_sum:loop<span class="comment">-- 循环开始</span></span><br><span class="line"><span class="keyword">set</span> num <span class="operator">=</span> num<span class="operator">+</span><span class="number">1</span>;</span><br><span class="line"><span class="keyword">set</span> sum <span class="operator">=</span> sum<span class="operator">+</span>num;</span><br><span class="line">if num<span class="operator">&gt;=</span><span class="number">10</span> <span class="keyword">then</span></span><br><span class="line">leave loop_sum;</span><br><span class="line"><span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span> loop loop_sum;</span><br></pre></td></tr></table></figure><h4 id="常用数据库函数与命令"><a class="markdownIt-Anchor" href="#常用数据库函数与命令"></a> 常用数据库函数与命令</h4><p>显示存储过程：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">PROCEDURE</span> STATUS;</span><br></pre></td></tr></table></figure><p>显示特定数据库的存储过程</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">PROCEDURE</span> status <span class="keyword">where</span> db <span class="operator">=</span> <span class="string">&#x27;schooldb&#x27;</span>;</span><br></pre></td></tr></table></figure><p>显示特定模式的存储过程，要求显示名称中包含“my”的存储过程：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">PROCEDURE</span> status <span class="keyword">where</span> name <span class="keyword">like</span> <span class="string">&#x27;%my%&#x27;</span>;</span><br></pre></td></tr></table></figure><p>显示存储过程“mypro1”的源码：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> mypro1;</span><br></pre></td></tr></table></figure><h4 id="嵌入式sql"><a class="markdownIt-Anchor" href="#嵌入式sql"></a> 嵌入式SQL</h4><p>赋值：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">declare</span> v_score <span class="type">int</span>;</span><br><span class="line"><span class="keyword">select</span> score <span class="keyword">into</span> v_score <span class="keyword">from</span> sc <span class="keyword">where</span> cno<span class="operator">=</span><span class="number">55</span> <span class="keyword">and</span> stuid<span class="operator">=</span><span class="number">001</span>;</span><br></pre></td></tr></table></figure><p>set值：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span> v_score<span class="operator">=</span>v_score<span class="operator">+</span><span class="number">1</span>;</span><br><span class="line"><span class="keyword">update</span> sc <span class="keyword">set</span> score<span class="operator">=</span>v_score <span class="keyword">where</span> cno<span class="operator">=</span><span class="number">55</span> <span class="keyword">and</span> stuid<span class="operator">=</span><span class="number">001</span>;</span><br></pre></td></tr></table></figure><h4 id="动态sql"><a class="markdownIt-Anchor" href="#动态sql"></a> 动态SQL</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> count_field(<span class="keyword">IN</span> FIELDNAME <span class="type">VARCHAR</span>(<span class="number">255</span>), <span class="keyword">IN</span> </span><br><span class="line">FIELDVALUE <span class="type">INT</span>) </span><br><span class="line"><span class="keyword">BEGIN</span> </span><br><span class="line"><span class="keyword">SET</span> <span class="variable">@sql</span> <span class="operator">=</span> CONCAT(<span class="string">&#x27;SELECT COUNT(*) FROM stu WHERE ‘, </span></span><br><span class="line"><span class="string">FIELDNAME, &#x27;</span> <span class="operator">=</span> ?’); </span><br><span class="line"><span class="keyword">PREPARE</span> stmt <span class="keyword">FROM</span> <span class="variable">@sql</span>; </span><br><span class="line"><span class="keyword">SET</span> <span class="variable">@fieldvalue</span> <span class="operator">=</span> FIELDVALUE; </span><br><span class="line"><span class="keyword">EXECUTE</span> stmt <span class="keyword">USING</span> <span class="variable">@fieldvalue</span>; </span><br><span class="line"><span class="keyword">DEALLOCATE</span> <span class="keyword">PREPARE</span> stmt; </span><br><span class="line"><span class="keyword">END</span>;</span><br></pre></td></tr></table></figure><h4 id="游标编程"><a class="markdownIt-Anchor" href="#游标编程"></a> 游标编程</h4><p>对查询语句返回的行结果集中的每一行进行单独处理。</p><p>主要功能：</p><ul><li>定位到结果集中的指定行</li><li>从结果集的当前位置检索一行或多行</li><li>可对结果集中当前位置的行进行数据修改</li><li>可以显示其他用户对结果集中的数据库函数进行的数据修改</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241205236.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241207438.png" alt="" /></p><h3 id="函数"><a class="markdownIt-Anchor" href="#函数"></a> 函数</h3><h3 id="触发器"><a class="markdownIt-Anchor" href="#触发器"></a> 触发器</h3><p><mark>特殊的存储过程，实现复杂逻辑的用户自定义约束的工具</mark></p><ul><li>与表|视图|数据库紧密相连，不能脱离宿主存在</li><li>由数据库自动调用执行，用户不能调用</li><li>没有参数和返回值</li></ul><p>Event（引起数据库更新的事件）—Condition（是否满足条件）—Action（任意的SQL）</p><p><strong>创建：</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">trigger</span> trigger_name BEFORE<span class="operator">|</span>AFTER<span class="operator">|</span>INSTEAD <span class="keyword">OF</span> trigger_EVENT <span class="keyword">ON</span> TABLE_NAME <span class="keyword">FOR</span> <span class="keyword">EACH</span> <span class="type">ROW</span> trigger_STMT </span><br></pre></td></tr></table></figure><ul><li>事件<ul><li>表|视图级事件：<code>insert/delete/update</code></li><li>数据库级事件：<code>create/alter/drop table/procedure/view</code></li></ul></li><li>触发时机：<code>after/before/instead of</code>（直接转到触发器动作，而不执行之前的<code>insert</code>，<code>update</code>等操作，<u><strong>可以实现不可更新视图的更新</strong>）</u></li><li>触发/执行粒度：<ul><li>语句级触发器：缺省，每条用户语句触发一次</li><li>行级触发器<code>for each row</code>：每条受影响的记录，触发一次触发器</li></ul></li><li><code>referecing</code>引用：包含操作的行<code>new.attribute</code>，<code>old.attribute</code></li><li>动作：多于一条语句<code>begin...end</code></li></ul><p>用触发器实现级联触发：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> fruitTrig after <span class="keyword">insert</span> <span class="keyword">on</span> sells <span class="keyword">referencing</span> <span class="keyword">new</span> <span class="type">row</span> <span class="keyword">as</span> newTuple <span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span> <span class="keyword">when</span>(newTuple.fname <span class="keyword">not</span> <span class="keyword">in</span> (<span class="keyword">select</span> fname <span class="keyword">from</span> fruits)) <span class="keyword">insert</span> <span class="keyword">into</span> fruits(fname) <span class="keyword">values</span>(newTuple.fname);</span><br></pre></td></tr></table></figure><p><code>newTuple</code>就是新增加的那一行</p><h1 id="06-存储与索引"><a class="markdownIt-Anchor" href="#06-存储与索引"></a> 06 存储与索引</h1><h2 id="存储"><a class="markdownIt-Anchor" href="#存储"></a> 存储</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101018009.png" alt="" /></p><h3 id="逻辑组织结构"><a class="markdownIt-Anchor" href="#逻辑组织结构"></a> 逻辑组织结构</h3><ul><li>块：一个磁盘页面，I/O一次读写一整个块。</li><li>区：磁盘上连续的块集合。</li><li>段：一个或多个盘区组成，只存储一类数据对象（表段，索引段，回滚段）<mark>一个表对应一个段</mark></li><li>表空间：<mark>数据对象的逻辑结构和物理结构统一</mark><ul><li>逻辑上由0~n个段组成，物理上1~n个数据文件组成。段不能跨越表空间，但可跨越空间内文件。</li><li>表空间——数据文件：一对多</li></ul></li><li>数据库：包含1~n个表空间（用户表空间，临时表空间…）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101029170.png" alt="" /></p><h3 id="物理页面组织结构"><a class="markdownIt-Anchor" href="#物理页面组织结构"></a> 物理页面组织结构</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101035859.png" alt="" /></p><h2 id="索引"><a class="markdownIt-Anchor" href="#索引"></a> 索引</h2><p>单级索引（二分表查找）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>n</mi></mrow><annotation encoding="application/x-tex">log_2n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">n</span></span></span></span>，数量庞大时效率低</p><p>多级索引：B+树索引</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101048296.png" alt="" /></p><p>如果数据量过大，树会很长，频繁磁盘I/O效率低。</p><ul><li>堆组织表：记录顺序没有限制，排列顺序不可预测（B+，Hash）</li><li>索引组织表</li><li>聚簇表：索引聚簇表，散列聚簇表</li></ul><h3 id="b树"><a class="markdownIt-Anchor" href="#b树"></a> B树</h3><p>数据库里面的数据不是一个个存储，是按页存储的。</p><p>行数据放在非叶节点中，导致页节点能放的索引项减少，树的层级增多，还是会频繁I/O。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101053814.png" alt="在这里插入图片描述" /></p><h3 id="b树索引"><a class="markdownIt-Anchor" href="#b树索引"></a> B+树索引</h3><p><mark>使用最广泛，是多级索引</mark></p><p>优点：</p><ul><li>范围查询效率更高</li><li>缓存命中率更高（空间局部性原理）</li><li>更新维护代价更小</li></ul><p>特点<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msub><mo><mi>log</mi><mo>⁡</mo></mo><mi>m</mi></msub><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(\log_{m}n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.057252em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>，m为分叉数</p><ul><li>数据都存储在叶结点，从树根到树叶的所有路径一样长。</li><li>叶结点之间有通道可供平行查询。</li><li>叶节点包含每个索引键和指向被索引行的指针（行id）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101039938.png" alt="" /></p><h4 id="索引更新"><a class="markdownIt-Anchor" href="#索引更新"></a> 索引更新</h4><p>插入删除不会引起过多I/O操作，树仍然平衡，保持了很好性能。</p><ul><li>I/O密集型</li><li>找到应当插入的叶节点</li><li>有空间：直接插入</li><li>没有空间：将该叶节点分裂成两个，使每个新节点有大于等于一半的键，并且向上直至不用再分裂</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101101145.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101102229.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101103144.png" alt="" /></p><p>重复键的处理：用链表存储重复的键值对应的行的RID的值。</p><ul><li>B+一般三层，需要三次I/O。如果根节点和中间节点存入缓存，只需1次。</li><li>何时使用： 当要查询的记录数占记录总数的百分比非常大的时候，不 用索引将比用索引更快</li></ul><h3 id="hash索引"><a class="markdownIt-Anchor" href="#hash索引"></a> Hash索引</h3><p>只需一次I/O。</p><p>索引值通过散列函数得到的一样的值全部存储到同一个数据块中。读取是读取整个数据块到内存中，在块中顺序查找目标。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101112860.png" alt="" /></p><blockquote><p>如果记录很多，可以增加一个溢出块到到桶的链上。</p><p><strong>溢出块过多增加I/O次数！！！</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101113786.png" alt="" /></p></blockquote><p>特点：</p><ul><li>CPU密集型</li><li>等值查找时速度快</li><li>不能使用范围查找</li><li>不适合在重复值很多的列上建立哈希索引</li><li>重构代价大，不适用更新频繁的表</li></ul><h3 id="聚簇索引"><a class="markdownIt-Anchor" href="#聚簇索引"></a> 聚簇索引</h3><p>数据在物理文件中的存放位置不再是无序（堆组织表），根据索引中的键值逻辑顺序</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406101129927.png" alt="" /></p><ul><li>物理顺序只有一个，一张表只有一个聚簇索引</li><li>在聚簇索引列上比B+树快</li><li>重复值也排在一起，范围检查也会变快</li><li>插入更新快的不用，维护开销大</li><li>MySQL在主键上建立</li></ul><h3 id="联合索引"><a class="markdownIt-Anchor" href="#联合索引"></a> 联合索引</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Select</span> <span class="operator">*</span> <span class="keyword">from</span> tb_a <span class="keyword">where</span> a<span class="operator">&gt;</span><span class="number">1</span> <span class="keyword">and</span> b<span class="operator">=</span><span class="number">1</span>;</span><br></pre></td></tr></table></figure><p>在（a，b）上建立，比单独建立更快。</p><ul><li>最左前缀原则：只有个使用了最左（即a），才会生效</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age<span class="operator">/</span><span class="number">2</span><span class="operator">&gt;</span><span class="number">20</span>;</span><br></pre></td></tr></table></figure><p>这样也不生效。</p><p>解决方法：改写为<code>age&gt;40</code>。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span>  <span class="operator">*</span> <span class="keyword">from</span> Emp <span class="keyword">where</span>  to_char(birth_day,‘YYYY<span class="operator">-</span>MM<span class="operator">-</span>DD’) <span class="operator">=</span> ‘<span class="number">2022</span><span class="number">-11</span><span class="number">-10</span>’;</span><br></pre></td></tr></table></figure><p>解决办法：建立函数索引<code>to_char birth_day,'YYYY-MM-DD</code>。</p><p><strong>分类</strong></p><p>字段特性：主键索引（非空，一张表一个），唯一索引（unique字段上，一张表可以有多个，索引列值唯一，但可以有空值）和普通索引</p><h3 id="查询优化"><a class="markdownIt-Anchor" href="#查询优化"></a> 查询优化</h3><ul><li>选择运算尽可能先做：减少中间关系</li><li>在执行连接操作前对关系适当进行预处理：按连接属性排序，在连接属性上建立索引</li><li>投影运算和选择运算同时做：避免重复扫描关系</li><li>将投影运算与前面或后面的双目运算结合</li></ul><h1 id="07-完整性约束"><a class="markdownIt-Anchor" href="#07-完整性约束"></a> 07 完整性约束</h1><p>完整性=数据的正确性和相容性</p><h2 id="完整性控制机制"><a class="markdownIt-Anchor" href="#完整性控制机制"></a> 完整性控制机制</h2><ul><li>完整性约束条件定义机制<ul><li>完整性约束条件：数据模型的组成部分，约束数据库中数据的定义</li><li><mark>DBMS提供定义数据库完整性约束条件的方法</mark></li></ul></li><li>完整性检查机制：检查用户发出的操作请求是否违背了完整性约束条件</li><li>违约反应：如果发现用户的操作请求使数据违背了完整性约束条件，则采取一定的动作来保证数据的完整性</li></ul><h3 id="完整性规则"><a class="markdownIt-Anchor" href="#完整性规则"></a> 完整性规则</h3><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>O</mi><mo separator="true">,</mo><mi>A</mi><mo separator="true">,</mo><mi>C</mi><mo separator="true">,</mo><mi>P</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(D,O,A,C,P)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mclose">)</span></span></span></span></span></p><p>D：约束作用的数据对象</p><p>O：触发完整性检查的数据库操作</p><p>A：数据对象必须满足的断言或语义约束</p><p>C：选择A作用的数据对象值的谓词</p><p>P：违反完整性规则时触发的过程</p><h2 id="完整性约束条件"><a class="markdownIt-Anchor" href="#完整性约束条件"></a> 完整性约束条件</h2><ul><li>完整性约束条件作用的对象：列，元组，关系</li><li>对象的两种状态：<ul><li>静态：对静态对象的约束是反映数据库状态合理性的约束</li><li>动态：对动态对象的约束是反映数据库状态变迁的约束。<font color='purple'><strong>涉及新值和旧值</strong></font></li></ul></li></ul><h3 id="分类-2"><a class="markdownIt-Anchor" href="#分类-2"></a> 分类</h3><h4 id="分类1"><a class="markdownIt-Anchor" href="#分类1"></a> 分类1</h4><ul><li><p>静态列级约束：取值类型，取值范围，是否为空,check</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> name <span class="keyword">add</span> <span class="keyword">constraint</span> name <span class="keyword">check</span> (sex <span class="keyword">in</span> (<span class="string">&#x27;男&#x27;</span>,<span class="string">&#x27;女&#x27;</span>));</span><br></pre></td></tr></table></figure></li><li><p>静态元组约束：元组间各个列之间的约束关系——用check实现</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> 表名称 <span class="keyword">add</span> <span class="keyword">constraint</span> 约束名称 <span class="keyword">check</span> (发货量<span class="operator">&lt;=</span>订货量);</span><br></pre></td></tr></table></figure></li><li><p>静态关系约束：各个元组之间或若干关系之间存在的各种联系或约束——<font color='purple'><strong>触发器实现</strong></font></p><ul><li><font color='gray'>职工平均工资的两倍&lt;部门经理的工资</font></li></ul></li><li><p>动态列级约束：修改列定义或列值时应满足的约束条件</p><ul><li>修改列定义时的约束：原来允许空值现在不允许，<strong>数据库自动实现</strong></li><li>修改列值时的约束：新旧值之间的约束，<strong>触发器</strong>（eg：年龄只能增长）</li></ul></li><li><p>动态元组约束：修改元组值——各个字段之间要满足的约束条件</p></li><li><p>动态关系约束：对关系变化前后状态的限制条件，事务一致性</p></li></ul><h4 id="分类2"><a class="markdownIt-Anchor" href="#分类2"></a> 分类2</h4><ul><li>域完整性：自定义</li><li>实体完整性约束（主键）：每个元组都是可识别的唯一的。不允许无主键&amp;主键值相同</li><li>参照完整性约束（外键）：外键值为空&amp;等于所参照关系中的某个元组的主键值</li><li>用户自定义约束：Check，触发器</li></ul><h2 id="违约反应"><a class="markdownIt-Anchor" href="#违约反应"></a> 违约反应</h2><ul><li>可以拒绝执行</li><li>接收操作，同时执行一些附加操作，保证数据库状态正确</li></ul><h3 id="删除元组"><a class="markdownIt-Anchor" href="#删除元组"></a> 删除元组</h3><ul><li>级联删除（CASCADES）：自动删除</li><li>受限删除（RESTRICTED）：没有对应的正常删除，有拒绝删除</li><li>置空值删除（NULLIFILES）：外码值置为空</li></ul><h3 id="插入元组"><a class="markdownIt-Anchor" href="#插入元组"></a> 插入元组</h3><p>若被参照关系不存在响应的元组：</p><ul><li>受限插入：没有对应的拒绝插入，有对应的可插入</li><li>递归插入：先向被参照关系中插入相应元组（主码值等于将要插入的外码值），再向参照关系插入</li></ul><h3 id="修改元组"><a class="markdownIt-Anchor" href="#修改元组"></a> 修改元组</h3><p>修改主键，在参照关系中已经被引用：</p><ul><li>级联修改：对应外键全部更新</li><li>受限修改：没有对应则更新，否则不更新</li><li>置空值修改：对应全部置空</li></ul><h1 id="08-安全"><a class="markdownIt-Anchor" href="#08-安全"></a> 08 安全</h1><p><strong>数据共享必然带来数据库的安全问题</strong></p><h2 id="安全认证"><a class="markdownIt-Anchor" href="#安全认证"></a> 安全认证</h2><p>确认试图登录数据库的用户是否被授权访问数据库的过程</p><h3 id="数据库认证"><a class="markdownIt-Anchor" href="#数据库认证"></a> 数据库认证</h3><p>使用存储在数据库的信息对连接到数据库的用户进行验证（常用：密码）</p><p>缺：容易被盗，难以应对复杂的网络攻击，频繁的验证操作影响性能</p><p>加强安全措施：建立密码复杂性标准，密码不包含敏感词，设置时效性</p><h3 id="外部认证"><a class="markdownIt-Anchor" href="#外部认证"></a> 外部认证</h3><ul><li>强身份认证：多因素<ul><li>优：根据需要选择不同身份认证机制，减少数据库管理开销</li></ul></li><li>代理认证：让中央设施对网络的所有成员进行身份验证<ul><li>优：有效解决网络上节点伪造身份，减小开销</li></ul></li></ul><h2 id="访问控制"><a class="markdownIt-Anchor" href="#访问控制"></a> 访问控制</h2><p>按照用户身份和权限，控制用户对数据库中数据访问</p><ul><li>阻止访问：无权限</li><li>确定访问权限：确定主体是否有权对客体进行访问</li><li>授予访问权限：授予主体对访问客体的权限</li><li>撤销访问权限：删除访问权限</li></ul><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">存</mi><mi mathvariant="normal">取</mi><mi mathvariant="normal">权</mi><mi mathvariant="normal">限</mi><mo>=</mo><mi mathvariant="normal">数</mi><mi mathvariant="normal">据</mi><mi mathvariant="normal">对</mi><mi mathvariant="normal">象</mi><mo>+</mo><mi mathvariant="normal">操</mi><mi mathvariant="normal">作</mi><mi mathvariant="normal">类</mi><mi mathvariant="normal">型</mi></mrow><annotation encoding="application/x-tex">存取权限=数据对象+操作类型</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">存</span><span class="mord cjk_fallback">取</span><span class="mord cjk_fallback">权</span><span class="mord cjk_fallback">限</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">据</span><span class="mord cjk_fallback">对</span><span class="mord cjk_fallback">象</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">操</span><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">类</span><span class="mord cjk_fallback">型</span></span></span></span></span></p><h3 id="分类-3"><a class="markdownIt-Anchor" href="#分类-3"></a> 分类</h3><p>系统权限：</p><ul><li><p>启动、关闭数据库</p></li><li><p>转储、恢复数据库</p></li><li><p>创建、删除数据库</p></li></ul><p>数据对象权限：insert，delete，update表，视图。存储过程等</p><p>列级权限</p><p>行级权限</p><p>连接级权限：连接控制</p><h3 id="权限控制语句"><a class="markdownIt-Anchor" href="#权限控制语句"></a> 权限控制语句</h3><p>授予grant，收回revoke</p><p>授予表级权限：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> <span class="keyword">select</span> <span class="keyword">on</span> tableA <span class="keyword">on</span> userA;</span><br></pre></td></tr></table></figure><p>列级权限：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> <span class="keyword">select</span> (a,b) <span class="keyword">on</span> tableA <span class="keyword">on</span> userA;</span><br></pre></td></tr></table></figure><p>创建新用户：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> username identified <span class="keyword">by</span> <span class="string">&#x27;password&#x27;</span>;</span><br></pre></td></tr></table></figure><p>授予登录数据库和查看数据的权利：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> usage <span class="keyword">on</span> dbname.<span class="operator">*</span> <span class="keyword">to</span> username@ <span class="string">&#x27;%&#x27;</span>;</span><br></pre></td></tr></table></figure><blockquote><p>谁能授予、收回权限：</p><ul><li>数据对象的创建者</li><li>DBA</li><li>拥有传播权限的用户（<code>with grant option</code>）</li></ul></blockquote><p>授予传播权限：</p><blockquote><p><mark>注意：只能传播已经被赋予<code>with grant option</code>的权限，没有赋予的不能被传播！！</mark></p><p>权限不能再传播到授权者或祖先！</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> <span class="keyword">select</span> <span class="keyword">on</span> tableA <span class="keyword">on</span> userA <span class="keyword">with</span> <span class="keyword">grant</span> option;</span><br></pre></td></tr></table></figure><h4 id="角色"><a class="markdownIt-Anchor" href="#角色"></a> 角色</h4><p>命名的权限集合，方便授权管理。<strong>角色可以基于其他角色（继承）</strong></p><ul><li>服务器角色：系统自建，不可自建</li><li>数据库角色：自建</li><li>public角色：所有用户都具有的权限</li></ul><p>创建角色：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> role roleA;</span><br></pre></td></tr></table></figure><p>逐个授予权限：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> <span class="keyword">insert</span>,<span class="keyword">delete</span> <span class="keyword">on</span> tableA <span class="keyword">to</span> roleA;</span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">execute</span> <span class="keyword">on</span> procedureA <span class="keyword">to</span> roleA;</span><br></pre></td></tr></table></figure><p>赋予指定用户：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grant</span> roleA <span class="keyword">to</span> userA;</span><br></pre></td></tr></table></figure><h1 id="09-事务管理"><a class="markdownIt-Anchor" href="#09-事务管理"></a> 09 事务管理</h1><p>并发控制必须保证数据库一致性，<strong>并发控制以<mark>事务</mark>为基本单位，对事务所操作的数据施加封锁来实现一致性</strong>，<mark>动态关系约束</mark></p><p>事务：<mark>不可分割</mark>，全做&amp;全不做，和程序两个概念， 一个对数据库进行操作的应用程序可以包含多个事务，这些事务是<strong>串行</strong>的。</p><p>用户自定义的事务以<code>begin transaction</code>开始，<code>commit|rollback</code>结束。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">BEGIN</span> TRANSACTION</span><br><span class="line"> READ A</span><br><span class="line"> A<span class="operator">=</span>A－<span class="number">100</span></span><br><span class="line"> IF A<span class="operator">&lt;</span><span class="number">0</span></span><br><span class="line"> <span class="keyword">THEN</span></span><br><span class="line"> <span class="keyword">BEGIN</span></span><br><span class="line"> DISPLAY “A款不足”</span><br><span class="line"> <span class="keyword">ROLLBACK</span></span><br><span class="line"> <span class="keyword">END</span></span><br><span class="line"> <span class="keyword">ELSE</span></span><br><span class="line"> <span class="comment">/* 拨款*/</span></span><br><span class="line"> <span class="keyword">BEGIN</span></span><br><span class="line"> READ B</span><br><span class="line"> B<span class="operator">=</span>B<span class="operator">+</span><span class="number">100</span></span><br><span class="line"> DISPLAY “拨款完成”</span><br><span class="line"> <span class="keyword">COMMIT</span></span><br><span class="line"> ENDsql</span><br></pre></td></tr></table></figure><p><font color='orange'><strong>事务：并发控制的基本单位，数据恢复的处理单位</strong></font></p><p>特征ACID：</p><ul><li>原子性Atomicity：要不全做，要不全不做；保证只执行了一部分的事务不会对数据库状态产生影响</li><li>隔离性Isolation：并发执行的事务不能相互影响</li><li>一致性Consistency：事务完成时，所有数据都保持一致状态</li><li>持久性Durability：事务一旦提交后，对数据库的影响必须是永久的</li></ul><p><font color='green'><strong>恢复机制：保证原子性和持久性</strong></font></p><p><font color='green'><strong>对事务的并行运行顺序合理安排：事务的隔离性和一致性</strong></font></p><h2 id="事务的并发执行"><a class="markdownIt-Anchor" href="#事务的并发执行"></a> 事务的并发执行</h2><h3 id="执行状态"><a class="markdownIt-Anchor" href="#执行状态"></a> 执行状态</h3><ul><li>活动状态：初始</li><li>部分提交状态：部分更新，但并未最后结束</li><li>失败状态：无法继续进行</li><li>终止状态：回滚所有操作，恢复到事务开始以前</li><li>提交：正确执行</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102242719.png" alt="" /></p><h3 id="并发操作带来的数据不一致性"><a class="markdownIt-Anchor" href="#并发操作带来的数据不一致性"></a> 并发操作带来的数据不一致性</h3><ul><li><p>丢失修改：事务同时修改同一数据,事务2破坏了事务1的提交</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102246088.png" alt="" /></p></li><li><p>不可重复读：事务1读取数据后，事务2执行更新操作，使事务1无法再现前一次读取结果。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102249205.png" alt="" /></p><ul><li>事务2更新数据</li><li>事务2删除数据</li><li>事务2插入一些符合事务1条件的数据（后两种叫幻影现象）</li></ul></li><li><p>读脏数据：事务2读取数据后，事务1撤销，造成事务2读入了不正确的数据</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102249259.png" alt="" /></p></li></ul><h2 id="并发控制机制"><a class="markdownIt-Anchor" href="#并发控制机制"></a> 并发控制机制</h2><h3 id="调度"><a class="markdownIt-Anchor" href="#调度"></a> 调度</h3><p>调度是并发运行的事务中各条指令的执行序列（应对各事务所有指令的执行时间顺序做出安排，保留原有的执行顺序）</p><p><strong>可串行化的调度</strong>：几个事务的并行执行是正确的，当且仅当其结果与按某一次序串行地执行它们时的结果相同。</p><ul><li>[x] 冲突可串行化</li><li>[ ] 视图可串行化</li></ul><p><mark>串行调度保证了数据库的一致性</mark></p><h4 id="冲突可串行化"><a class="markdownIt-Anchor" href="#冲突可串行化"></a> 冲突可串行化</h4><p>只有同时读不冲突，两个指令可以随意调换位置。（调换前后——冲突等价）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102303549.png" alt="" /></p><h5 id="前驱图"><a class="markdownIt-Anchor" href="#前驱图"></a> 前驱图</h5><p>画：如果两个事务冲突，且1先访问，那么画一条1—&gt;2的有向边，且在边上标注冲突资源</p><p>化简：如果无环—&gt;冲突可串行，利用拓扑排序获得调度顺序</p><p><mark>不要在最先访问处画完所有</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102309254.png" alt="" /></p><h4 id="可恢复"><a class="markdownIt-Anchor" href="#可恢复"></a> 可恢复</h4><p>若事务j读取了事务i之前写入的数据，则i的提交应该早于j，以防出现回滚导致的不一致问题</p><p><mark>无级联调度也是可恢复调</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102311193.png" alt="" /></p><h4 id="回滚"><a class="markdownIt-Anchor" href="#回滚"></a> 回滚</h4><ul><li>级联回滚：如果失败，需要连续回滚</li><li>无级联调度：可恢复调度，要求高</li></ul><p><font color='orange'><strong>冲突：可串行，可恢复，最好是无级联</strong></font></p><h3 id="锁"><a class="markdownIt-Anchor" href="#锁"></a> 锁</h3><p>事务锁定使用的资源以防止其它事务访问/修改。</p><ul><li>排它锁X：写锁，对数据对象A加上X锁，则只允许T读取和修改A，其他任何事物都不能对A加任何类型锁，直到释放锁</li><li>共享锁S：读锁，对数据对象A加S锁，其他事务是能对它加S锁，不能加X锁。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102317284.png" alt="" /></p><h4 id="协议"><a class="markdownIt-Anchor" href="#协议"></a> 协议</h4><p>协议内容：何时申请X|S锁，持锁时间，何时释放</p><h5 id="一级封锁协议"><a class="markdownIt-Anchor" href="#一级封锁协议"></a> 一级封锁协议</h5><p>修改数据就加X锁，直至事务结束；读数据不加锁：防止丢失修改，但不能保证</p><p>可重复读:<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102323481.png" alt="" style="zoom:60%;" />不读脏数据：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102322059.png" alt="" style="zoom: 67%;" /></p><h5 id="二级封锁协议"><a class="markdownIt-Anchor" href="#二级封锁协议"></a> 二级封锁协议</h5><p>写数据加X锁，读数据加S锁，读完即可释放：保证丢失修改和不读脏数据，不能保证可重复读。</p><p>不读脏数据：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102326871.png" alt="" style="zoom:67%;" /><p>不能保证可重复读：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102327420.png" alt="" style="zoom:67%;" /><h5 id="三级封锁协议"><a class="markdownIt-Anchor" href="#三级封锁协议"></a> 三级封锁协议</h5><p>修改数据加X锁，读取数据之前加S锁，直至事务结束才释放：可防止丢失修改、读脏数据和不可重复读。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102330181.png" alt="" style="zoom:67%;" /><h5 id="事务隔离级别"><a class="markdownIt-Anchor" href="#事务隔离级别"></a> 事务隔离级别</h5><ul><li>读未提交：事务A未提交所做的修改也会对事务B的查询有影响——1级</li><li>读已提交：事务提交才会产生影响——2级协议</li><li>可重复读：当两个事务同时进行时，其中一个事务修改数据对另一个事务不会造成影响， 即使修改的事务已经提交也不会对另一个事务造成影响——低于3级</li><li>串行化：两个事务同时进行，即使读取数据也会被锁定，不能被别的事务修改——3级</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102333125.png" alt="" /></p><h3 id="两阶段封锁协议2pl"><a class="markdownIt-Anchor" href="#两阶段封锁协议2pl"></a> 两阶段封锁协议2PL</h3><p><font color='orange'><strong>不能解决死锁问题</strong></font></p><p><mark>能够保证并发执行结果正确性的封锁协议</mark></p><p><strong>可解决所有数据不一致问题！！！</strong> 能够保证并发执行结果正确性：获得封锁——释放封锁</p><ul><li>在对任何数据进行读、写操作之前，事务首先要获得对该数据的封锁</li><li>在释放一个封锁之后，事务不再获得任何其他封锁</li></ul><p><strong><mark>对一组遵守两段锁协议的事务，可以实现可串行化调度，使得其并行执行的结果一定是正确的。但可串行化的调度中，不一定所有事物都必须符合两段锁协议</mark></strong></p><p>丢失更新：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102340423.png" alt="" /></p><p>不可重复读：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102341655.png" alt="" /></p><p>脏读：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406102343225.png" alt="" /></p><p>不能解决级联回滚和死锁</p><h4 id="严格的两段锁协议"><a class="markdownIt-Anchor" href="#严格的两段锁协议"></a> 严格的两段锁协议</h4><p>增加规则：事务获得的锁只有在事务结束时才释放</p><p><mark>第三级封锁协议与严格的两阶段锁协议一致</mark></p><h2 id="死锁"><a class="markdownIt-Anchor" href="#死锁"></a> 死锁</h2><h3 id="预防"><a class="markdownIt-Anchor" href="#预防"></a> 预防</h3><p>破坏死锁产生条件</p><p>一次封锁法：一次性将所有要使用的数据全部加锁</p><h3 id="诊断与解除"><a class="markdownIt-Anchor" href="#诊断与解除"></a> 诊断与解除</h3><ul><li>允许死锁发生</li><li>解决死锁<ul><li>由DBMS的并发控制子系统定期检测系统中是否存在死锁</li><li>一旦检测到死锁，就要设法接触</li></ul></li><li>等待图法检测死锁</li></ul><h1 id="10-备份与恢复"><a class="markdownIt-Anchor" href="#10-备份与恢复"></a> 10 备份与恢复</h1><h2 id="分类-4"><a class="markdownIt-Anchor" href="#分类-4"></a> 分类</h2><h3 id="逻辑备份恢复"><a class="markdownIt-Anchor" href="#逻辑备份恢复"></a> 逻辑备份恢复</h3><ul><li>利用sql从数据库提取数据，存入文件。可重新导入数据库中。</li><li>DBMS提供的导出&amp;导入实现</li><li>备份效率低，影响数据库性能（适用于小型数据库）</li></ul><h3 id="物理备份恢复"><a class="markdownIt-Anchor" href="#物理备份恢复"></a> 物理备份恢复</h3><ul><li>基于数据文件和日志文件的备份恢复</li><li>效率高，对数据库运行性能影响小</li><li>备份策略复杂</li></ul><p><mark>恢复技术是系统安全性的重要保证，保证事务的原子性和持久性</mark></p><ul><li>原子性：事务操作全做&amp;全不做</li><li>持久性：已提交事务对数据库影响是持久的，未提交事务对数据库没有影响</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111708664.png" alt="" /></p><h2 id="缓冲区处理策略"><a class="markdownIt-Anchor" href="#缓冲区处理策略"></a> 缓冲区处理策略</h2><ul><li>Force：内存中数据最晚在commit时写入磁盘</li><li>No Force：内存数据一直保留，commit之后过一段时间写入磁盘（崩溃还没写入，没能持久化）</li><li>No Steal：不允许在commit之前写入磁盘</li><li>Steal：允许在commit之前写入磁盘</li></ul><p><strong>最常使用No Force+Steal策略</strong></p><h3 id="no-stealforce"><a class="markdownIt-Anchor" href="#no-stealforce"></a> No Steal+Force</h3><p>只能在commit时写入。</p><h2 id="恢复实现的技术"><a class="markdownIt-Anchor" href="#恢复实现的技术"></a> 恢复实现的技术</h2><h3 id="故障分类"><a class="markdownIt-Anchor" href="#故障分类"></a> 故障分类</h3><h4 id="事务故障"><a class="markdownIt-Anchor" href="#事务故障"></a> 事务故障</h4><p>某个事务在运行过程中未运行至正常终止点就夭折（输入数据有误、运算溢出…）<mark>只影响故障事务 （程序）本身</mark></p><p><strong>恢复</strong></p><p>撤销事务（UNDO）：对未提交事务进行强行回滚，清除该事务对数据库的所有修改，消除未提交事务的影响。</p><h4 id="系统故障"><a class="markdownIt-Anchor" href="#系统故障"></a> 系统故障</h4><p>正常运行突然被破坏，所有正在运行的事务都非正常终止，缓冲区信息全部丢失（OS&amp;DBMS代码错误,硬件错误，停电…）<mark>影响到当前正在运行的事务或部分已经运行完结的事务</mark></p><p><strong>恢复</strong></p><ul><li>清除尚未完成的事务对数据库的所有修改：重新启动时，恢复程序强行撤销（UNDO）所有未完成事务</li><li>将缓冲区已完成事务提交的结果写入数据库：恢复程序需要重做（REDO）所有已提交的事务</li><li>日志文件帮助</li></ul><h4 id="介质故障"><a class="markdownIt-Anchor" href="#介质故障"></a> 介质故障</h4><p>外存数据丢失，破坏性大（磁盘破坏，磁头碰撞…）<mark>影响到内存中的数据和磁盘上的数据</mark></p><p><strong>恢复</strong></p><ul><li>装入数据库发生介质故障前某个时刻的数据副本</li><li>重做自此时始所有成功事务，将这些事务已提交的结果重新计入数据库</li><li>需要备份数据和日志文件的帮助</li></ul><h3 id="恢复技术"><a class="markdownIt-Anchor" href="#恢复技术"></a> 恢复技术</h3><p><font color='red' background='blue'>冗余</font></p><h4 id="数据转储"><a class="markdownIt-Anchor" href="#数据转储"></a> 数据转储</h4><p>整个数据库复制到磁带或者另一个磁盘上保存起来。</p><ul><li><p>静态转储：无运行事务时进行转储，转储期间不允许改动数据库。实现简单；但降低了可用性。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111708146.png" alt="" /></p></li><li><p>动态转储：允许转储和用户事务并发运行。优点：不用等待事务结束，也不影响新事务运行；不能保证副本的数据有效。<mark>要把转储期间的修改活动登记，建立日志文件</mark>。恢复时需要日志文件+后备副本。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111708280.png" alt="" /></p></li><li><p>全量存储（海量）：每次转储全部数据文件。</p></li><li><p>增量转储：只转储上次转储后更新过的数据（策略复杂，备份时对数据库影响小）。</p></li></ul><h4 id="登录日志文件"><a class="markdownIt-Anchor" href="#登录日志文件"></a> 登录日志文件</h4><p><mark>登记日志文件</mark>（记录事务对数据库的更新操作的文件）：顺序写入效率高，<strong>先写日志文件，再写数据缓冲区，再写入数据文件（便于回退）</strong></p><p>文件内容：</p><ul><li>事务开始标记：begin transaction</li><li>结束标记：commit|rollback</li><li>更新操作</li><li>事务有关的内部更新操作</li></ul><p>作用：发生<strong>系统故障</strong>，已提交事务重做Redo，未提交撤销Undo</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111716394.png" alt="" /></p><h4 id="不同模式的恢复"><a class="markdownIt-Anchor" href="#不同模式的恢复"></a> 不同模式的恢复</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111716785.png" alt="" /></p><p>No Steal+Force：已提交的不受影响，未提交的自动回滚。每次事务都要进行磁盘随机写入，但性能很差。</p><p>No Steal+No Force：未提交自动回滚，已提交可能还没写到数据文件，日志文件和数据文件不一致（引入Redo日志文件，解决内存数据丢失）</p><p>Steal+Force：已提交没有影响，未提交可能被持久化到数据文件，日志文件与数据文件不一致（引入Undo日志文件，清除数据文件中未提交数据）</p><p>Steal+No Force：未提交可能被持久化到数据文件，已提交可能还没写到数据文件。（Redo,Undo,Redo/Undo）</p><h3 id="恢复策略"><a class="markdownIt-Anchor" href="#恢复策略"></a> 恢复策略</h3><h4 id="基于undo日志的恢复策略"><a class="markdownIt-Anchor" href="#基于undo日志的恢复策略"></a> 基于Undo日志的恢复策略</h4><h5 id="内容"><a class="markdownIt-Anchor" href="#内容"></a> 内容</h5><p>&lt;start t&gt;事务开始，&lt;commit t&gt;事务提交，&lt;abort t&gt;事务被回滚，&lt;t,x,v&gt;t事务已经更新数据项x，其更新前的旧值是v。</p><h5 id="规则"><a class="markdownIt-Anchor" href="#规则"></a> 规则</h5><ol><li>如果事务T更新了数据项X，则日志记录&lt;T,X,v&gt;必须在X被写入磁盘之前写入磁盘。</li><li>如果事务T提交，则日志记录必须在T所做的所有更改写入数据文件后才能写入日志文件</li></ol><p><mark><strong>更新：日志先写；提交：日志后写</strong></mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111759133.png" alt="" /></p><h5 id="恢复思路"><a class="markdownIt-Anchor" href="#恢复思路"></a> 恢复思路</h5><ul><li>从日志文件纬度读取日志记录</li><li>读到commit|abort标记T为结束状态</li><li>读到&lt;T,X,v&gt;如果不是结束状态，就将X=v写入磁盘数据文件</li></ul><p>恢复的每种操作都是<mark>幂等的</mark>：执行一次或多次结果相同，意味着多次遇到系统故障，重新启动即可恢复，不会影响系统数据</p><h4 id="基于redo日志的恢复策略"><a class="markdownIt-Anchor" href="#基于redo日志的恢复策略"></a> 基于Redo日志的恢复策略</h4><h5 id="内容-2"><a class="markdownIt-Anchor" href="#内容-2"></a> 内容</h5><p>&lt;start t&gt;事务开始，&lt;commit t&gt;事务提交，&lt;abort t&gt;事务被回滚，&lt;t,x,v&gt;t事务已经更新数据项x，其更新前的新值是v。</p><h5 id="规则-2"><a class="markdownIt-Anchor" href="#规则-2"></a> 规则</h5><p><strong><mark>更新和commit：日志文件先写</mark></strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111811519.png" alt="" /></p><h5 id="恢复思路-2"><a class="markdownIt-Anchor" href="#恢复思路-2"></a> 恢复思路</h5><ul><li>查看redo日志，确定事务T是否完成</li><li>从日志开头读取日志记录，对于每一个已完成的事务，对它进行重做操作</li></ul><h5 id="与undo的比较"><a class="markdownIt-Anchor" href="#与undo的比较"></a> 与Undo的比较</h5><p>Undo：事务结束先对磁盘进行数据文件写入，性能较差；事务故障时回滚恢复旧值，保证原子性</p><p>Redo：可以延后写入数据文件，将已提交的重做，保证持久性，但是不允许steal，灵活性差</p><h4 id="基于undoredo的日志恢复策略"><a class="markdownIt-Anchor" href="#基于undoredo的日志恢复策略"></a> 基于Undo/Redo的日志恢复策略</h4><h5 id="内容-3"><a class="markdownIt-Anchor" href="#内容-3"></a> 内容</h5><p>&lt;start t&gt;事务开始，&lt;commit t&gt;事务提交，&lt;abort t&gt;事务被回滚，&lt;t,x,u,v&gt;t事务已经更新数据项x，其更新前的新值是v，旧值是u。</p><h5 id="规则-3"><a class="markdownIt-Anchor" href="#规则-3"></a> 规则</h5><p><strong><mark>更新：日志文件先写；commit随意</mark></strong></p><h5 id="恢复思路-3"><a class="markdownIt-Anchor" href="#恢复思路-3"></a> 恢复思路</h5><ul><li>确定各个事务是否已经完成</li><li>从日志开头读取，已完成的事务Redo；没提交的事务Undo</li></ul><h4 id="基于检查点的恢复策略"><a class="markdownIt-Anchor" href="#基于检查点的恢复策略"></a> 基于检查点的恢复策略</h4><p>在日志文件中增加检查点，增加一个“重新开始文件”作为日志文件维护状况，最新检查点作为下次恢复工作的起点</p><p>检查点记录内容：</p><ul><li>建立检查点时刻所有正在执行的事务清单</li><li>这些事务最近一个日志记录的地址</li></ul><p>重新开始文件：记录各个检查点记录在日志文件中的地址</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406111818203.png" alt="" /></p><h1 id="11-关系数据理论"><a class="markdownIt-Anchor" href="#11-关系数据理论"></a> 11 关系数据理论</h1><p>关系数据库的规范化理论包括三个方面的内容：函数依赖（核心），范式（模式分解的标准），模式分解</p><p>根据教学管理数据库例子：</p><ul><li>数据冗余：系名和系主任名字重复存储</li><li>插入异常：新开设的系没有学生，无法存入数据库</li><li>删除异常：该系所有学生毕业，系仍然存在，但找不到系的信息</li><li>更新异常：学生改名，系主任更改</li></ul><p>分解关系模式：学生，选课，系</p><p>好的关系模式：<strong>尽可能少的数据冗余，没有插入异常、删除异常、更新异常</strong></p><h2 id="函数依赖"><a class="markdownIt-Anchor" href="#函数依赖"></a> 函数依赖</h2><p>关系模式中的各属性之间相互依赖、相互制约的联系称为数据依赖：分为函数依赖、多值依赖和连接依赖。</p><p>eg：给出SNO，由于一个学生只能属于一个系，则SN（姓名），AGE，DEPT（系名称）都能被唯一确定，类似于F（x）关系。这里说（SN,AGE,DEPT）函数依赖于SNO。</p><p>定义：</p><blockquote><p>设关系模式R（U，F），U是属性全集，F是U上的函数依赖集，X和Y是U的子集，如果对于R(U)的任意一个可能的关系r，对于X的每一个具体值，Y都有唯一的具体值与之对应，则称X决定函数Y，或Y函数依赖于X，记作X→Y。我们称X为决定因素，Y为依赖因素。当Y不函数依赖于X时，记作：X ⇸Y。当X→Y且Y→X时，则记作：X↔︎Y。</p><p>（SNO，CNO）→SCORE，学号+班级号唯一确定成绩</p></blockquote><h3 id="说明"><a class="markdownIt-Anchor" href="#说明"></a> 说明</h3><p><strong>平凡&amp;非平凡</strong></p><ul><li>平凡的函数依赖：Y是X的子集，（SNO，CNO）→SNO</li><li>非平凡的：Y不是X的子集，通常讨论</li></ul><p><strong>函数依赖是语义范畴的概念</strong></p><ul><li>要先设定学生不存在重名，SN（学生姓名）→AGE才能成立</li></ul><p>反应了<mark>语义完整性约束</mark></p><p><strong>函数依赖的存在与时间无关</strong></p><ul><li>所有元组都应该满足约束条件</li><li>元组的增加、删除或更新都不能破坏这种函数依赖</li></ul><p><strong>函数依赖可以保证关系分解的无损连接性</strong></p><h3 id="分类-5"><a class="markdownIt-Anchor" href="#分类-5"></a> 分类</h3><ul><li><strong><u>完全函数依赖</u></strong>：设 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo separator="true">,</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X,Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span> 是关系 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span> 的两个属性集合，如果 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>，并且对于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span> 的任何一个真子集<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">X&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>，都有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">!</mo><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X&#x27;!\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">!</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>，则称 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span> 对 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span> 完全函数依赖。<ul><li>C可以通过AB得到，并且C不可以仅通过A得到，也不可以仅通过B得到，那么就说C完全依赖AB。</li></ul></li><li><strong><u>部分函数依赖</u></strong>：对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span> 的某个真子集<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">X&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>，有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X&#x27;\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>，则称 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span> 对部分函数依赖。<ul><li>C可以通过AB得到，并且C也可以仅通过A得到，仅通过B得到，那么就说C部分依赖AB。</li></ul></li><li><strong><u>传递函数依赖</u></strong>：设<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo separator="true">,</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">X,Y,Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span>是关系 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span> 中互不相同的属性集合，存在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">!</mo><mo>→</mo><mi>X</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>Y</mi><mo>→</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">X→Y(Y !→X),Y→Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">!</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span>，则称 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span> 传递函数依赖于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span> 。<ul><li>B可以通过A得到，C可以通过B得到，那么就称C传递依赖A。</li></ul></li></ul><h4 id="定义候选键"><a class="markdownIt-Anchor" href="#定义候选键"></a> 定义候选键</h4><blockquote><p>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>K</mi><msup><mo>→</mo><mi>f</mi></msup><mi>U</mi></mrow><annotation encoding="application/x-tex">K\rightarrow^f U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8491079999999999em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel">→</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>（即完全函数依赖），称K为R的一个候选键。如果有多个候选键，选定一个作为主键。</p><p>K是R的一个候选键，且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mo>⊃</mo><mi>K</mi></mrow><annotation encoding="application/x-tex">S⊃K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">K</span></span></span></span>，S是R的超键。</p><p>候选键中出现过的为主属性，主属性外的为非主属性。</p></blockquote><h4 id="定义外键"><a class="markdownIt-Anchor" href="#定义外键"></a> 定义外键</h4><blockquote><p>关系模式R 中属性或属性组X 并非R 的候选键，但X 是另一个关系模式的候选键，则称X 是R 的外键。</p></blockquote><h2 id="范式"><a class="markdownIt-Anchor" href="#范式"></a> 范式</h2><blockquote><p>把关系数据库的规范化过程中为不同程度的规范化要求设立的不同标准称为范式。</p></blockquote><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>N</mi><mi>F</mi><mo>⊃</mo><mn>2</mn><mi>N</mi><mi>F</mi><mo>⊃</mo><mn>3</mn><mi>N</mi><mi>F</mi><mo>⊃</mo><mi>B</mi><mi>C</mi><mi>N</mi><mi>F</mi><mo>⊃</mo><mn>4</mn><mi>N</mi><mi>F</mi><mo>⊃</mo><mn>5</mn><mi>N</mi><mi>F</mi></mrow><annotation encoding="application/x-tex">1NF\supset2NF\supset3NF\supset BCNF\supset4NF\supset5NF   </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord">1</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord">3</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord">4</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span></span></span></span></p><p>一级比一级有更严格的要求。</p><h3 id="1nf"><a class="markdownIt-Anchor" href="#1nf"></a> 1NF</h3><blockquote><p>关系中每个属性都是不可再分的简单项。排除了多值属性，组合属性。</p><p>错误示例：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221358267.png" alt="" /></p></blockquote><p>既存在完全函数依赖，又存在部分函数依赖和传递函数依赖。</p><p>解决：用投影运算将关系分解，去掉过于复杂的函数依赖关系，向更高一级的范式进行转换。</p><h3 id="2nf"><a class="markdownIt-Anchor" href="#2nf"></a> 2NF</h3><blockquote><p>每个非主属性都完全函数依赖于R的每个关系键。</p></blockquote><p>解释：数据表里的每一条数据记录，都是可唯一标识的。而且所有非主键字段，都必须完全依赖主键，不能只依赖主键的一部分。</p><ul><li>从1NF关系中消除非主属性对关系键的部分函数依赖，可得到2NF</li><li>如果R的关系键为单属性，或R的全体属性均为主属性，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>∈</mo><mn>2</mn><mi>N</mi><mi>F</mi></mrow><annotation encoding="application/x-tex">R\in2NF</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span></span></span></li></ul><h4 id="规范化投影分解"><a class="markdownIt-Anchor" href="#规范化投影分解"></a> 规范化—<strong><mark>投影分解</mark></strong></h4><p>选课表：SC(Sid,Sname,Department,Chairman,Lname,Score)</p><p>其中，姓名，系名，系主任由学号唯一确定。</p><p>所以拆分成两个表：</p><p>选课（学号，课名，分数）；学生（学号，姓名，系名，系主任）。</p><p>问题：</p><ul><li>数据冗余：系名和系主任存储次数等于该系学生人数。</li><li>插入异常：系没有学生无法插入。</li><li>删除异常：某系学生全部毕业，系的相关信息也删除。</li><li>更新异常：更换系主任，需要较多改动学生记录。</li></ul><p>原因：存在着非主属性对主键的传递依赖。</p><h3 id="3nf"><a class="markdownIt-Anchor" href="#3nf"></a> 3NF</h3><blockquote><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo>∈</mo><mn>2</mn><mi>N</mi><mi>F</mi></mrow><annotation encoding="application/x-tex">R\in2NF</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span></span></span>，且每个非主属性都不传递依赖于R的每个关系键。</p></blockquote><p>学号<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">→</span></span></span></span>系名，系名<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">→</span></span></span></span>系主任。</p><p>所以拆分为：</p><p>选课（学号，课名，分数）；学生（学号，姓名，系名）；系（系名，系主任）。</p><blockquote><p>Q:所存在的异常现象已经全部消失。规范化的重点？</p><p>A:只限制了非主属性对键的依赖关系，而没有限制主属性对键的依赖关系。还可能出现异常。</p></blockquote><p>SNC（SNO，SN，CNO，SCORE）假设没有重名，有两个候选键（SNO，CNO）和（SN，CNO）。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221425663.png" alt="" /></p><h3 id="bcnf"><a class="markdownIt-Anchor" href="#bcnf"></a> BCNF</h3><blockquote><p>消除任何属性（主属性或非主属性）对键的部分函数依赖和传递函数依赖。</p></blockquote><h3 id="规范化"><a class="markdownIt-Anchor" href="#规范化"></a> 规范化</h3><h4 id="规范化步骤"><a class="markdownIt-Anchor" href="#规范化步骤"></a> 规范化步骤</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221427417.png" alt="" /></p><h4 id="非规范化设计"><a class="markdownIt-Anchor" href="#非规范化设计"></a> 非规范化设计</h4><ul><li>大量频繁的查询过程所涉及的表都需要进行连接</li><li>主要的应用程序在执行时要将表连接起来查询</li><li>对数据的计算需要临时表或进行复杂的查询</li></ul><p><mark>需要维护，占用更多磁盘空间</mark></p><h5 id="增加冗余列"><a class="markdownIt-Anchor" href="#增加冗余列"></a> 增加冗余列</h5><p>检索一门课的任课教师姓名，class和teacher连接——在class表中增加teacher_name</p><h5 id="增加派生列"><a class="markdownIt-Anchor" href="#增加派生列"></a> 增加派生列</h5><blockquote><p>增加的列来自其他表中的数据，由它们计算生成。</p></blockquote><p>减少连接操作，避免使用集函数。</p><h5 id="重新组表"><a class="markdownIt-Anchor" href="#重新组表"></a> 重新组表</h5><blockquote><p>需要查看两个表连接起来的结果数据</p></blockquote><h5 id="分库分表"><a class="markdownIt-Anchor" href="#分库分表"></a> 分库分表</h5><ul><li>水平分割：一列或多列数据的值把数据行放到两个独立的表中</li><li>垂直分割：把主键和一些列放到一个表，然后把主键和另外的列放到 另一个表中（查询所有数据需要join）</li></ul><h2 id="模式分解"><a class="markdownIt-Anchor" href="#模式分解"></a> 模式分解</h2><p><mark>在这些分解方法中，只有能够保证分解后的关系模式与原关系模式等价的方法才是有意义的</mark></p><h3 id="数据依赖的公理系统"><a class="markdownIt-Anchor" href="#数据依赖的公理系统"></a> 数据依赖的公理系统</h3><p>逻辑蕴含：对于满足一组函数依赖F 的关系模式R ，其任何一个关系r，若函数依赖X→Y都成立, 则称F 逻辑蕴含X →Y</p><blockquote><p>R&lt;U,F&gt;: U = {A,B,C} F={A-&gt;B,B-&gt;C}<br />则有，F逻辑蕴含A-&gt;B，AB-&gt;B，A-&gt;C</p><p>理由是：A-&gt;B是在F函数依赖集里面显式给出的，AB-&gt;B B属性式AB的一个子集，所以AB必然决定B， A-&gt;C则是通过函数依赖传递得到的。</p></blockquote><h4 id="armstrong公理系统"><a class="markdownIt-Anchor" href="#armstrong公理系统"></a> Armstrong公理系统</h4><blockquote><p>一套推理规则，是模式分解算法理论基础。</p><p>用于：</p><ul><li>从一组函数依赖求得蕴含的函数依赖。</li><li>求给定关系模式的候选键。</li></ul></blockquote><ul><li>自反律：若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi><mo>⊆</mo><mi>X</mi><mo>⊆</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">Y\subseteq X\subseteq U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>为F所蕴含。<ul><li>X包含Y，即Y是X的子集，所以必然有X决定Y。<u><strong>平凡的函数依赖</strong></u></li></ul></li><li>增广律：若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>为F所蕴含，且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Z</mi><mo>⊆</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">Z\subseteq U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>Z</mi><mo>→</mo><mi>Y</mi><mi>Z</mi></mrow><annotation encoding="application/x-tex">XZ\rightarrow YZ</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span>为F所蕴含。<ul><li>可以在函数依赖两边加一样的属性</li></ul></li><li>传递律：若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>及<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi><mo>→</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">Y\rightarrow Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span>为F所蕴含，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span></span></span></span>为F所蕴含。</li></ul><p>推论：</p><ol><li>合并规则：由X→Y，X→Z，有X→YZ</li><li>伪传递规则：由X→Y，WY→Z，有XW→Z。</li><li>分解规则：由X→Y及 Z含于Y，有X→Z。</li></ol><h4 id="函数依赖闭包"><a class="markdownIt-Anchor" href="#函数依赖闭包"></a> 函数依赖闭包</h4><p>在关系模式R中为F所逻辑蕴含的函数依赖的全体叫作F的闭包，记为F+。</p><blockquote><p>函数依赖的闭包指F所逻辑蕴含的所有成立的函数依赖，而对于平凡函数依赖（如 （A,B）—&gt;A ）都被F所逻辑蕴含，即便F是一个空集，其闭包也包含很多函数依赖<br /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221605751.png" alt="在这里插入图片描述" /></p></blockquote><h5 id="属性集的闭包"><a class="markdownIt-Anchor" href="#属性集的闭包"></a> 属性集的闭包</h5><p>设F为属性集U上的一组函数依赖，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>⊆</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">X\subseteq U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>， 则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup><mo>=</mo><mo stretchy="false">{</mo><mi>A</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">X_F^+ =\{ A | X→A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">A</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>能由F 根据Armstrong公理导出} <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span>称为属性集X关于函数依赖集F 的闭包。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221610468.png" alt="在这里插入图片描述" /></p><p><mark>它将<strong>函数依赖是否成立</strong> 转化为 <strong>属性集闭包</strong>的问题</mark></p><p>求属性集<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>X</mi><mo>⊆</mo><mi>U</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X(X\subseteq U)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mclose">)</span></span></span></span>关于U上的函数依赖集F的闭包<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span>的算法：</p><ul><li>输入：X,F</li><li>输出：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span></li></ul><p>步骤：</p><ul><li>令<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>=</mo><mi>X</mi><mo separator="true">,</mo><mi>i</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">X(0)=X,i=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span></li><li>求B，这里B=\{A|(\exist V)(\exist W)(V\rightarrow W\in F\and V\subseteq X(i)\and A\in W\}</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mi>B</mi><mo>∪</mo><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X(i+1)=B\cup X(i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mclose">)</span></span></span></span></li><li>判断<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X(i+1)=X(i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mclose">)</span></span></span></span>吗？</li><li>相等或<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">X(i)=U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X(i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mclose">)</span></span></span></span>就是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span>，算法终止。</li><li>否则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mo>+</mo><mo>+</mo></mrow><annotation encoding="application/x-tex">i++</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">+</span></span></span></span></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221620502.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221620097.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221620073.png" alt="" /></p><h4 id="最小依赖集"><a class="markdownIt-Anchor" href="#最小依赖集"></a> 最小依赖集</h4><p><strong><u>函数依赖集等价</u></strong>：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>G</mi><mo>+</mo></msup><mo>=</mo><msup><mi>F</mi><mo>+</mo></msup></mrow><annotation encoding="application/x-tex">G^+=F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.771331em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.771331em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span></span></span></span>，F覆盖G，或F与G等价。</p><p>充分必要条件：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>⊆</mo><msup><mi>G</mi><mo>+</mo></msup><mo separator="true">,</mo><mi>G</mi><mo>⊆</mo><msup><mi>F</mi><mo>+</mo></msup></mrow><annotation encoding="application/x-tex">F\subseteq G^+,G\subseteq F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.9657709999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">G</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.771331em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span></span></span></span></p><p>逐一对F中的函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>，考察Y是否属于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mrow><mi>G</mi><mo>+</mo></mrow><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_{G+}^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.163324em;vertical-align:-0.351862em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.406469em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">G</span><span class="mord mtight">+</span></span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.351862em;"><span></span></span></span></span></span></span></span></span></span>即可。</p><p><strong><u>最小依赖集</u></strong>：</p><ul><li>F中任一函数依赖的右部仅含有一个属性。</li><li>F中不存在这样的函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，使得F与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>−</mo><mo stretchy="false">{</mo><mi>X</mi><mo>→</mo><mi>A</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">F-\{X\rightarrow A\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mclose">}</span></span></span></span>等价。</li><li>F中不存在这样的函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，X有真子集Z使得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>−</mo><mo stretchy="false">{</mo><mi>X</mi><mo>→</mo><mi>A</mi><mo stretchy="false">}</mo><mo>∪</mo><mrow><mi>Z</mi><mo>→</mo><mi>A</mi></mrow></mrow><annotation encoding="application/x-tex">F-\{X\rightarrow A\}\cup {Z\rightarrow A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault">A</span></span></span></span></span>与F等价。</li></ul><p><mark>最小依赖集构造方法</mark>：</p><ul><li>逐一检查F中各函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><msub><mi>D</mi><mi>i</mi></msub><mo>:</mo><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">FD_i:X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>，若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi><mo>=</mo><msub><mi>A</mi><mn>1</mn></msub><msub><mi>A</mi><mn>2</mn></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>A</mi><mi>k</mi></msub><mo separator="true">,</mo><mi>k</mi><mo>&gt;</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">Y=A_1A_2...A_k,k&gt;2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>，则用<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">{</mo><mi>X</mi><mo>→</mo><msub><mi>A</mi><mi>j</mi></msub><mi mathvariant="normal">∣</mi><mi>j</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><mi>k</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{X\rightarrow A_j|j=1,2,...,k\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mclose">}</span></span></span></span>来取代<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\rightarrow Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span></li><li>逐一检查F中各函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><msub><mi>D</mi><mi>i</mi></msub><mo>:</mo><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">FD_i:X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，令<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mo>=</mo><mi>f</mi><mo>−</mo><mo stretchy="false">{</mo><mi>x</mi><mo>→</mo><mi>A</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">G=f-\{x\rightarrow A\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mclose">}</span></span></span></span>，若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>∈</mo><msubsup><mi>X</mi><mi>G</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">A\in X_G^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">G</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span>，则从F中去掉此函数依赖</li><li>逐一检查F中各函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><msub><mi>D</mi><mi>i</mi></msub><mo>:</mo><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">FD_i:X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，设<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>=</mo><msub><mi>B</mi><mn>1</mn></msub><msub><mi>B</mi><mn>2</mn></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>B</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">X=B_1B_2...B_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，逐一考察<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>∈</mo><mo stretchy="false">(</mo><mi>X</mi><mo>−</mo><msub><mi>B</mi><mi>i</mi></msub><msub><mo stretchy="false">)</mo><msup><mi>F</mi><mo>+</mo></msup></msub></mrow><annotation encoding="application/x-tex">A\in(X-B_i)_{F^+}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.341865em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7026642857142857em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则以<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>−</mo><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">X-B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>取代X</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642528.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642847.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642533.png" alt="" /></p><h3 id="模式分解的判定依据"><a class="markdownIt-Anchor" href="#模式分解的判定依据"></a> 模式分解的判定依据</h3><h4 id="无损连接性"><a class="markdownIt-Anchor" href="#无损连接性"></a> 无损连接性</h4><blockquote><p>分解前与分解后自然连接的结果相等。保证不丢失信息。</p><p>不一定能解决插入异常、删除异常等问题</p></blockquote><h5 id="列表法"><a class="markdownIt-Anchor" href="#列表法"></a> 列表法</h5><p><a href="https://blog.csdn.net/dyyay521/article/details/111874768">数据库手把手解题——1.判断无损连接_数据库无损连接的判断-CSDN博客</a></p><h5 id="定理法"><a class="markdownIt-Anchor" href="#定理法"></a> 定理法</h5><blockquote><p>适合关系模式R分解为两个关系模式R1、R2的</p></blockquote><p>若关系模式R&lt;U,F&gt;中，被分解为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ρ</mi><mo>=</mo><mo stretchy="false">{</mo><msub><mi>R</mi><mn>1</mn></msub><mo>&lt;</mo><msub><mi>U</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>F</mi><mn>1</mn></msub><mo>&gt;</mo><mo separator="true">,</mo><msub><mi>R</mi><mn>2</mn></msub><mo>&lt;</mo><msub><mi>U</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>F</mi><mn>2</mn></msub><mo>&gt;</mo><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\rho=\{R_1&lt;U_1,F_1&gt;,R_2&lt;U_2,F_2&gt;\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ρ</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mclose">}</span></span></span></span>是R的一个分解，若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>R</mi><mn>1</mn></msub><mo>∩</mo><msub><mi>R</mi><mn>2</mn></msub><mo>→</mo><msub><mi>R</mi><mn>1</mn></msub><mo>−</mo><msub><mi>R</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">R_1\cap R_2\rightarrow R_1-R_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>或者<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>R</mi><mn>1</mn></msub><mo>∩</mo><msub><mi>R</mi><mn>2</mn></msub><mo>→</mo><msub><mi>R</mi><mn>2</mn></msub><mo>−</mo><msub><mi>R</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">R_1\cap R_2\rightarrow R_2-R_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，则具有无损连接性</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221719942.png" alt="" /></p><blockquote><p>一个分解具有无损连接性，能够保证不丢失信息。</p><p>一个分解保持了函数依赖，可以减轻或解决各种异常情况。</p><p>两者相互独立。</p></blockquote><h4 id="保持函数依赖"><a class="markdownIt-Anchor" href="#保持函数依赖"></a> 保持函数依赖</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221722576.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221722073.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221725695.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221726669.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221726764.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221727943.png" alt="" /></p><h1 id="12-数据库设计"><a class="markdownIt-Anchor" href="#12-数据库设计"></a> 12 数据库设计</h1><h2 id="概述"><a class="markdownIt-Anchor" href="#概述"></a> 概述</h2><ul><li>静态的数据库结构设计：根据给定的应用环境，进行数据库的模式的设计<ul><li>直观设计法：缺乏理论依据</li><li>规范设计法：需求分析，概念设计，逻辑设计，物理设计</li></ul></li><li>动态的数据库行为设计</li></ul><h2 id="需求分析"><a class="markdownIt-Anchor" href="#需求分析"></a> 需求分析</h2><p>重点是调查、收集与分析用户在数据管理中的：</p><ul><li>信息要求</li><li>处理要求：响应时间，处理方式</li><li>安全性和完整性要求：形成需求文档</li></ul><p>分析和表达用户的需求的常用方法：</p><ul><li>自顶向下的结构化分析方法（SA）：数据流图和数据字典</li><li>面向对象的分析方法</li></ul><h3 id="数据流图"><a class="markdownIt-Anchor" href="#数据流图"></a> 数据流图</h3><p>用特定的符号反映系统的数据传递和变换过程的图。</p><p>组成：数据流<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">→</span></span></span></span>，处理（椭圆），数据存储（=），实体（□）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241516375.png" alt="" /></p><h3 id="数据字典"><a class="markdownIt-Anchor" href="#数据字典"></a> 数据字典</h3><p>进行详细的数据收集和数据分析所获得主要结果</p><p>组成：</p><ul><li>数据项<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241518042.png" alt="" style="zoom:50%;" /></li><li>数据结构<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241518366.png" alt="" style="zoom:50%;" /></li><li>数据流<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241519682.png" alt="" style="zoom: 50%;" /></li><li>数据存储</li><li>处理过程</li></ul><h2 id="概念结构设计"><a class="markdownIt-Anchor" href="#概念结构设计"></a> 概念结构设计</h2><p>ER图</p><h2 id="逻辑结构设计"><a class="markdownIt-Anchor" href="#逻辑结构设计"></a> 逻辑结构设计</h2><p>由ER图向关系模型转换</p><p>设计用户子模式（定义视图）</p><h1 id="13-nosql与云数据库"><a class="markdownIt-Anchor" href="#13-nosql与云数据库"></a> 13 NoSQL与云数据库</h1><h2 id="分布式数据库"><a class="markdownIt-Anchor" href="#分布式数据库"></a> 分布式数据库</h2><h3 id="起源bigtable"><a class="markdownIt-Anchor" href="#起源bigtable"></a> 起源—BigTable</h3><p>解决google的大规模网页搜索问题</p><ul><li>底层数据存储：GFS</li><li>处理海量数据：利用谷歌提出的MapReduce分布式并行计算模型</li><li>协同服务管理：采用Chubby所提供的能力</li><li>可扩展能力：数据到PB级、机器达上千台</li></ul><h3 id="hbase概述"><a class="markdownIt-Anchor" href="#hbase概述"></a> HBase概述</h3><p>BigTable开源实现：目标是处理非常庞大的表。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221538402.png" alt="" /></p><ul><li>解决大规模数据的离线批量处理问题</li><li>克服了RDB面对大规模数据时系统扩展性和性能差问题</li><li>克服了RDB难于处理非结构化与半结构化数据的缺陷</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221539764.png" alt="" /></p><p>数据模型：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221546756.png" alt="" /></p><h2 id="nosql非关系型数据库"><a class="markdownIt-Anchor" href="#nosql非关系型数据库"></a> NoSQL非关系型数据库</h2><ul><li>灵活的可扩展性</li><li>灵活的数据模型</li><li>与云计算紧密结合</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241936833.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241937894.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241945917.png" alt="" /></p><h2 id="nosql技术特点"><a class="markdownIt-Anchor" href="#nosql技术特点"></a> NoSQL技术特点</h2><ul><li><p>键值数据库：键值对。键是字符串对象，值是任意类型。</p><ul><li>优：扩展性好，灵活性好，大量写操作时性能高。</li><li>缺：无法存储结构化信息，条件查询效率低。不适用通过值而非键来查</li></ul></li><li><p>列族数据库：分布式数据存储与管理</p><ul><li>优：查找速度快，可扩展性强，容易进行分布式扩展，复杂性低</li><li>低：功能较少，不支持强事务一致性</li><li>不适用需要ACID事务支持的情形</li></ul></li><li><p>文档数据库：用于存储并检索文档数据，<mark>可以基于文档内容构建索引（区别于键值数据库）</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406241955684.png" alt="" /></p><ul><li>优：数据不规则，数据迁移容易，ACID保证，读写速度快</li><li>缺：缺乏统一的查询语法</li></ul></li><li><p>图形数据库：图结构，专门用于处理具有高度相互关联关系的数据</p><ul><li>优：灵活性高，支持复杂的图形算法</li><li>缺：复杂性高，只能支持一定的数据规模</li></ul></li><li><p>搜索数据库：</p></li><li><p>时序数据库：</p></li></ul><h3 id="nosql三大基石"><a class="markdownIt-Anchor" href="#nosql三大基石"></a> NoSQL三大基石</h3><p><mark><strong>最终一致性，CAP，BASE</strong></mark></p><h4 id="cap"><a class="markdownIt-Anchor" href="#cap"></a> CAP</h4><ul><li>Consistency一致性：任何一个读操作总能读到之前完成的写操作的结果</li><li>Availability可用性：快速获取数据，不管成功失败都有响应</li><li>Tolerance of Network Partition分区容忍性：当出现网络分区情况时，分离的系统也能够正常运行</li></ul><p><strong>一个分布式系统最多只能同时满足其两个</strong></p><ul><li>CA：把所有与事务相关的内容都放到同一台机器上（传统关系数据库），延展性差</li><li>CP：当出现网络分区的情况时，受影响的服务需要等待数据一致，在等待期间无法对外提供服务</li><li>AP：允许系统返回不一致的数据</li></ul><h4 id="base"><a class="markdownIt-Anchor" href="#base"></a> BASE</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406242007044.png" alt="" /></p><ul><li>基本可用：允许分区失败的情形出现</li><li>软状态：可以有一段时间不同步，有一定的滞后性</li><li>最终一致性（弱一致性的一种特例）：允许暂时读不到更新后的数据，但是经过一段时间后，必须最终读到更新后的数据</li></ul><h2 id="云数据库"><a class="markdownIt-Anchor" href="#云数据库"></a> 云数据库</h2><p>部署和虚拟化在云计算环境中的数据库</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406242011066.png" alt="" /></p><h1 id="final"><a class="markdownIt-Anchor" href="#final"></a> Final</h1><h2 id="选择"><a class="markdownIt-Anchor" href="#选择"></a> 选择</h2><h3 id="概论"><a class="markdownIt-Anchor" href="#概论"></a> 概论</h3><h4 id="dbdbmsdbadbs"><a class="markdownIt-Anchor" href="#dbdbmsdbadbs"></a> DB,DBMS,DBA,DBS</h4><ul><li>DB数据库：按一定结构组织并长期存储在计算机内的、可共享的大量数据的有机集合。</li><li>DBMS数据库管理系统：是管理和维护数据库的系统软件。MySQL，Oracle</li><li>DBA管理操作数据库人员</li><li>DBS数据库系统：基于数据库建立的一种信息系统，通常由应用程序、数据库DB、数据库管理系统DBMS和用户组成</li></ul><h4 id="与文件系统比较"><a class="markdownIt-Anchor" href="#与文件系统比较"></a> 与文件系统比较</h4><ul><li>数据冗余度大；一个文件对应一个应用程序，数据不能共享</li><li>数据独立性低：一旦改变数据的逻辑结构，必须修改相应的应用程序</li><li>数据的一致性差</li></ul><h2 id="问答"><a class="markdownIt-Anchor" href="#问答"></a> 问答</h2><h3 id="数据库系统特点"><a class="markdownIt-Anchor" href="#数据库系统特点"></a> 数据库系统特点</h3><ul><li>数据结构化</li><li>数据共享</li><li>数据独立性</li><li>方便的用户接口</li><li>同一的数据管理与控制功能</li></ul><h3 id="存储过程优点"><a class="markdownIt-Anchor" href="#存储过程优点"></a> 存储过程优点</h3><ul><li>是SQL与模块化编程的结合，能够完成复杂业务功能</li><li>在创建的时候进行预编译，可以提高SQL执行效率</li><li>位于数据库服务器上，调用的时候无需通过网络传输大量数据</li><li>可以作为一种安全机制来加以充分利用，例如参数化的存储过程可以防止SQL注入式攻击</li></ul><h3 id="游标的主要功能"><a class="markdownIt-Anchor" href="#游标的主要功能"></a> 游标的主要功能</h3><ul><li>定位到结果集中的指定行</li><li>从结果集的当前位置检索一行或多行</li><li>可对结果集中当前位置的行进行数据修改</li><li>可以显示其他用户对结果集中的数据库函数进行的数据修改</li></ul><h3 id="orm"><a class="markdownIt-Anchor" href="#orm"></a> ORM</h3><p>在关系型数据库和对象之间做映射。在操作数据库时不需要SQL，直接像操作对象一样操作它。</p><ul><li>提高开发效率</li><li>数据库平台透明</li><li>数据库结构自动维护</li><li>代码可读性高</li></ul><h3 id="数据库设计新奥尔良法基本步骤"><a class="markdownIt-Anchor" href="#数据库设计新奥尔良法基本步骤"></a> 数据库设计（新奥尔良法）基本步骤</h3><ul><li>需求分析阶段 ：准确了解与分析用户需求</li><li>概念结构设计阶段 ：对用户需求进行综合、归纳与抽象，形成一个独立于具体DBMS的概念模型</li><li>逻辑结构设计阶段 ：将概念结构转换为某个DBMS所支持的数据模型</li><li>物理结构设计阶段 ：为逻辑数据模型选取一个最适合应用环境的物理结构</li><li>数据库实施阶段：运用DBMS提供的数据语言、工具及宿主语言，根据逻辑设计和物理设计的结果</li><li>数据库运行和维护阶段：经过试运行后即可投入正式运行</li></ul><h3 id="视图-2"><a class="markdownIt-Anchor" href="#视图-2"></a> 视图</h3><p>作用：</p><ul><li>简化用户的操作</li><li>使用户能以多种角度看待同一数据</li><li>对重构数据库提供了一定程度的逻辑独立性</li><li>对机密数据提供安全保护</li></ul><h3 id="触发器-2"><a class="markdownIt-Anchor" href="#触发器-2"></a> 触发器</h3><p>触发器主要是通过事件进行触发而被执行的，而存储过程可以通过存储过程名字而被直接调用。</p><p>作用：</p><ul><li>强化约束：触发器能够实现比CHECK 语句更为复杂的约束。</li><li>跟踪变化：触发器可以侦测数据库内的操作，从而不允许数据库中未经许可的指定更新和变化。</li><li>级联运行：触发器可以侦测数据库内的操作，并自动地级联影响整个数据库的各项内容。例如，某个表上的触发器中包含有对另外一个表的数据操作(如删除，更新，插入)而该操作又导致该表上触发器被触发。</li><li>存储过程的调用：为了响应数据库更新,触发器可以调用一个或多个存储过程，甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。</li></ul><h2 id="大题"><a class="markdownIt-Anchor" href="#大题"></a> 大题</h2><h3 id="关系代数-2"><a class="markdownIt-Anchor" href="#关系代数-2"></a> 关系代数</h3><p>相同属性连接直接自然连接——<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⋈</mo></mrow><annotation encoding="application/x-tex">\bowtie</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.51em;vertical-align:-0.005em;"></span><span class="mrel">⋈</span></span></span></span></p><p>不同属性连接用笛卡尔积+判断条件——<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi><mo stretchy="false">(</mo><mi>a</mi><mi mathvariant="normal">.</mi><mi>n</mi><mi>u</mi><mi>m</mi><mo>=</mo><mi>b</mi><mi mathvariant="normal">.</mi><mi>b</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>A</mi><mo>×</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sigma(a.num=b.boss)(A\times B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mord">.</span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mord">.</span><span class="mord mathdefault">b</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</span></span></span></span></p><p><strong><u><mark>至少|所有类问题</mark></u></strong></p><p>记得用除（就是选择符合被除属性的其余属性项）！！</p><ol><li>查询选了所有课程的学生姓名<p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo>∏</mo><mrow><mi>S</mi><mi>N</mi><mi>A</mi><mi>M</mi><mi>E</mi></mrow></munder><mo stretchy="false">(</mo><munder><mo>∏</mo><mrow><mi>C</mi><mi>N</mi><mi>O</mi><mo separator="true">,</mo><mi>S</mi><mi>N</mi><mi>O</mi></mrow></munder><mo stretchy="false">(</mo><mi>S</mi><mi>C</mi><mo stretchy="false">)</mo><mo>÷</mo><munder><mo>∏</mo><mrow><mi>C</mi><mi>N</mi><mi>O</mi></mrow></munder><mo stretchy="false">(</mo><mi>C</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>⋈</mo><mo stretchy="false">(</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\prod_{SNAME}(\prod_{CNO,SNO}(SC)÷\prod_{CNO}(C))\bowtie(S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.480449em;vertical-align:-1.430444em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0500050000000003em;"><span style="top:-1.855664em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">S</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">M</span><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.294336em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8556639999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">C</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">O</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight" style="margin-right:0.05764em;">S</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">O</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.430444em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.344341em;vertical-align:-1.294336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0500050000000003em;"><span style="top:-1.855664em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">C</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">O</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.294336em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⋈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span></span></p></li></ol><p>查找教的学生的成绩都大于60分的教师（给出教师号即可）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo>∏</mo><mrow><mi>T</mi><mi>N</mi><mi>O</mi></mrow></munder><mo stretchy="false">(</mo><mi>S</mi><mi>C</mi><mo stretchy="false">)</mo><mo>−</mo><munder><mo>∏</mo><mrow><mi>T</mi><mi>N</mi><mi>O</mi></mrow></munder><mo stretchy="false">(</mo><msub><mi>σ</mi><mrow><mi>s</mi><mi>c</mi><mi>o</mi><mi>r</mi><mi>e</mi><mo>&lt;</mo><mo>=</mo><mn>60</mn></mrow></msub><mo stretchy="false">(</mo><mi>S</mi><mi>C</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\prod_{TNO}(SC)-\prod_{TNO}(\sigma_{score&lt;=60}(SC))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.344341em;vertical-align:-1.294336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0500050000000003em;"><span style="top:-1.855664em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">O</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.294336em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.344341em;vertical-align:-1.294336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0500050000000003em;"><span style="top:-1.855664em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">O</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.294336em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="mord mathdefault mtight">c</span><span class="mord mathdefault mtight">o</span><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span><span class="mord mathdefault mtight">e</span><span class="mrel mtight">&lt;</span><span class="mrel mtight">=</span><span class="mord mtight">6</span><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.17737em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p><p>查找张三的直属领导和直属下级的员工编号：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo>∏</mo><mrow><mi>n</mi><mi>u</mi><mi>m</mi></mrow></munder><mo stretchy="false">(</mo><mi>σ</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>e</mi><mn>1.</mn><mi>b</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo>=</mo><mi>e</mi><mn>2.</mn><mi>n</mi><mi>u</mi><mi>m</mi><mtext> </mtext><mi>o</mi><mi>r</mi><mtext> </mtext><mi>e</mi><mn>1.</mn><mi>n</mi><mi>u</mi><mi>m</mi><mo>=</mo><mi>e</mi><mn>2.</mn><mi>b</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">)</mo><mtext> </mtext><mi>a</mi><mi>n</mi><mi>d</mi><mtext> </mtext><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal">′</mo></msup><mi mathvariant="normal">张</mi><msup><mi mathvariant="normal">三</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>e</mi><mi>m</mi><mi>p</mi><mn>1</mn><mo>×</mo><mi>e</mi><mi>m</mi><mi>p</mi><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\prod_{num}(\sigma((e1.boss=e2.num\ or\ e1.num=e2.boss)\ and\ name=&#x27;张三&#x27;)(emp1\times emp2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.3000100000000003em;vertical-align:-1.250005em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8999949999999999em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord mathdefault mtight">u</span><span class="mord mathdefault mtight">m</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∏</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250005em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mopen">(</span><span class="mord mathdefault">e</span><span class="mord">1</span><span class="mord">.</span><span class="mord mathdefault">b</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord mathdefault">e</span><span class="mord">2</span><span class="mord">.</span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mspace"> </span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace"> </span><span class="mord mathdefault">e</span><span class="mord">1</span><span class="mord">.</span><span class="mord mathdefault">n</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord mathdefault">e</span><span class="mord">2</span><span class="mord">.</span><span class="mord mathdefault">b</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mclose">)</span><span class="mspace"> </span><span class="mord mathdefault">a</span><span class="mord mathdefault">n</span><span class="mord mathdefault">d</span><span class="mspace"> </span><span class="mord mathdefault">n</span><span class="mord mathdefault">a</span><span class="mord mathdefault">m</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord cjk_fallback">张</span><span class="mord"><span class="mord cjk_fallback">三</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathdefault">e</span><span class="mord mathdefault">m</span><span class="mord mathdefault">p</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault">m</span><span class="mord mathdefault">p</span><span class="mord">2</span><span class="mclose">)</span></span></span></span></span></p><h3 id="sql"><a class="markdownIt-Anchor" href="#sql"></a> SQL</h3><p><strong><mark>默认是保留重复的行（ALL），消除取值重复的行DISTINCT</mark></strong></p><blockquote><p>作用范围是所有目标列，<strong>写一个就好！！！</strong></p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> sno <span class="keyword">from</span> sc;</span><br></pre></td></tr></table></figure><p>ASC升序，DESC降序</p><h4 id="相关子查询"><a class="markdownIt-Anchor" href="#相关子查询"></a> 相关子查询</h4><p>查询员工中工资大于本部门平均工资的员工的name, salary和department_id</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> name,salary,deparment_id <span class="keyword">from</span> e1 <span class="keyword">where</span> salary<span class="operator">&gt;</span>(<span class="keyword">select</span> <span class="built_in">avg</span>(salary) <span class="keyword">from</span> employees e2 <span class="keyword">where</span> department_id<span class="operator">=</span>e1.department_id);</span><br></pre></td></tr></table></figure><p>查询选修了全部课程的学生姓名：</p><blockquote><p>理解为查询一个人的姓名，这个人不存在课程没有选择。</p><p>1.拿出student表中的一行数据</p><p>2.拿出课程表的一行数据</p><p>3.拿出sc表的一行数据，对比判断是否选择了</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sname <span class="keyword">from</span> student <span class="keyword">where</span> <span class="keyword">not</span> <span class="keyword">exists</span>(<span class="keyword">select</span> <span class="operator">*</span> course <span class="keyword">where</span> <span class="keyword">not</span> <span class="keyword">exists</span> (<span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> sc <span class="keyword">where</span> sc.sno<span class="operator">=</span>student.sno <span class="keyword">and</span> sc.cno<span class="operator">=</span>c.cno));</span><br></pre></td></tr></table></figure><p>或者直接查询选择的课程数是否等于全部课程数：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sname,sno <span class="keyword">from</span> s,sc <span class="keyword">where</span> s.sno<span class="operator">=</span>sc.sno <span class="keyword">group</span> <span class="keyword">by</span> sno <span class="keyword">having</span> <span class="built_in">count</span>(<span class="operator">*</span>)<span class="operator">=</span><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> c;</span><br></pre></td></tr></table></figure><p><mark>最多最少问题</mark>：</p><ul><li>使用ALL，ANY</li><li>通过子查询比较</li></ul><p>查询被单个学生重修次数最多的课程号、课程名、教师名：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> cno <span class="keyword">from</span> sc <span class="keyword">group</span> <span class="keyword">by</span> sno,cno <span class="keyword">having</span> <span class="built_in">count</span>(<span class="operator">*</span>)<span class="operator">&gt;=</span><span class="keyword">all</span>(<span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> sc <span class="keyword">group</span> <span class="keyword">by</span> sno,cno <span class="keyword">having</span> <span class="built_in">count</span>(<span class="operator">*</span>)<span class="operator">&gt;</span><span class="number">1</span>);</span><br></pre></td></tr></table></figure><p>查询员工平均薪资最高的部门（可能有多个）：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> dept <span class="keyword">from</span> emp e1 <span class="keyword">group</span> <span class="keyword">by</span> dept <span class="keyword">having</span> <span class="built_in">avg</span>(salary)<span class="operator">&gt;=</span><span class="keyword">all</span>(<span class="keyword">select</span> <span class="built_in">avg</span>(salary) <span class="keyword">from</span> emp e2 <span class="keyword">group</span> <span class="keyword">by</span> dept);</span><br></pre></td></tr></table></figure><h4 id="dml"><a class="markdownIt-Anchor" href="#dml"></a> DML</h4><p>创建表：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> table_name(</span><br><span class="line">sid <span class="type">varchar</span>(<span class="number">20</span>) <span class="keyword">primary</span> key,</span><br><span class="line">sname <span class="type">varchar</span>(<span class="number">20</span>) <span class="keyword">not</span> <span class="keyword">null</span>,</span><br><span class="line">count <span class="type">int</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><p>insert:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> table_name(sid,sname,count) </span><br><span class="line"><span class="keyword">select</span> s.sid <span class="keyword">as</span> sid,s.sname <span class="keyword">as</span> sname,<span class="built_in">count</span>(sc.cid) <span class="keyword">as</span> count <span class="keyword">from</span> s,sc <span class="keyword">where</span> s.sid<span class="operator">=</span>sc.sid <span class="keyword">group</span> <span class="keyword">by</span> sid;</span><br></pre></td></tr></table></figure><p>将学生的重修课程成绩都改成60分：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">update</span> sc s1 <span class="keyword">set</span> score<span class="operator">=</span><span class="number">60</span> <span class="keyword">where</span> stime<span class="operator">&gt;</span>(<span class="keyword">select</span> <span class="built_in">min</span>(stime) <span class="keyword">from</span> sc s2 <span class="keyword">where</span> s1.sno<span class="operator">=</span>s2.sno <span class="keyword">and</span> s1.cno<span class="operator">=</span>s2.cno);</span><br></pre></td></tr></table></figure><h4 id="视图-3"><a class="markdownIt-Anchor" href="#视图-3"></a> 视图</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">view</span> view_name[列名<span class="number">1</span>,列名<span class="number">2</span>,列名<span class="number">3</span>]</span><br><span class="line"><span class="keyword">as</span></span><br><span class="line">子查询</span><br><span class="line">[<span class="keyword">with</span> <span class="keyword">check</span> option];</span><br></pre></td></tr></table></figure><p><code>with check option</code>：透过视图进行增删改操作时，不得破坏视图定义中的谓词条件（即子查询中的条件表达式）</p><p>eg：</p><p>创建一个视图，列出每个比同类别商品平均价格高的商品的ID、名称、价格、部门平均价格。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> 高于平均价格的商品视图 <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    商品.商品ID,</span><br><span class="line">    商品.名称,</span><br><span class="line">    商品.价格,</span><br><span class="line">    商品.类别,</span><br><span class="line">    <span class="built_in">AVG</span>(同类别商品.价格) <span class="keyword">AS</span> 平均价格</span><br><span class="line"><span class="keyword">FROM</span> </span><br><span class="line">    商品</span><br><span class="line"><span class="keyword">JOIN</span> </span><br><span class="line">    商品 <span class="keyword">AS</span> 同类别商品 <span class="keyword">ON</span> 商品.类别 <span class="operator">=</span> 同类别商品.类别</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> </span><br><span class="line">    商品.商品ID, 商品.名称, 商品.价格, 商品.类别</span><br><span class="line"><span class="keyword">HAVING</span> </span><br><span class="line">    商品.价格 <span class="operator">&gt;</span> <span class="built_in">AVG</span>(同类别商品.价格);</span><br></pre></td></tr></table></figure><h3 id="事务管理"><a class="markdownIt-Anchor" href="#事务管理"></a> 事务管理</h3><h4 id="前驱图检查冲突可串行性"><a class="markdownIt-Anchor" href="#前驱图检查冲突可串行性"></a> 前驱图检查冲突可串行性</h4><p>冲突：读—写，写—写</p><p><mark>不要在最先访问处画完所有</mark></p><p>化简：如果无环—&gt;冲突可串行，利用拓扑排序获得调度顺序</p><h4 id="两段锁协议"><a class="markdownIt-Anchor" href="#两段锁协议"></a> 两段锁协议</h4><ul><li>两段锁2PL：所有的数据库操作有可能会要求加锁，并且释放锁。这一切都发生在事务内部。</li><li>严格两段锁：必须要等到事务完成（提交|回滚）才能释放锁。</li></ul><h3 id="备份与恢复"><a class="markdownIt-Anchor" href="#备份与恢复"></a> 备份与恢复</h3><blockquote><p>级联回滚：某些事务用到了回滚的事务修改的数据。</p></blockquote><h4 id="undo"><a class="markdownIt-Anchor" href="#undo"></a> Undo</h4><p><mark><strong>更新：日志先写；提交：日志后写</strong></mark></p><p>解决Steal+Force，未提交事务提早写入磁盘，已提交事务一定写入磁盘。</p><p>恢复：回滚未提交事务</p><ul><li>从日志文件纬度读取日志记录</li><li>读到commit|abort标记T为结束状态</li><li>读到&lt;T,X,v&gt;如果不是结束状态，就将X=v写入磁盘数据文件</li></ul><h4 id="redo"><a class="markdownIt-Anchor" href="#redo"></a> Redo</h4><p><mark><strong>更新和commit：日志文件先写</strong></mark></p><p>解决No Steal+No Force，已经提交事务可能没有写入磁盘，未提交的一定没有写入磁盘。</p><p>恢复：重做已提交的事务</p><ul><li>查看redo日志，确定事务T是否完成</li><li>从日志开头读取日志记录，对于每一个已完成的事务，对它进行重做操作</li></ul><h4 id="undoredo"><a class="markdownIt-Anchor" href="#undoredo"></a> Undo/Redo</h4><p><strong><mark>更新：日志文件先写；commit随意</mark></strong></p><p>解决Steal+No Force，已提交的可能没写入磁盘，未提交的可能已写入磁盘。</p><p>恢复：重做已完成的，撤销没完成的</p><ul><li>确定各个事务是否已经完成</li><li>从日志开头读取，已完成的事务Redo；没提交的事务Undo</li></ul><h3 id="规范化理论"><a class="markdownIt-Anchor" href="#规范化理论"></a> 规范化理论</h3><h4 id="求闭包"><a class="markdownIt-Anchor" href="#求闭包"></a> 求闭包</h4><p>求属性集<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo stretchy="false">(</mo><mi>X</mi><mo>⊆</mo><mi>U</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X(X\subseteq U)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="mclose">)</span></span></span></span>关于U上的函数依赖集F的闭包<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>X</mi><mi>F</mi><mo>+</mo></msubsup></mrow><annotation encoding="application/x-tex">X_F^+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.104993em;vertical-align:-0.293531em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.811462em;"><span style="top:-2.4064690000000004em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.1031310000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.293531em;"><span></span></span></span></span></span></span></span></span></span>：</p><p>先将<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>放入结果，通过已有都能确定什么。</p><h4 id="求候选键"><a class="markdownIt-Anchor" href="#求候选键"></a> 求候选键</h4><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">L</span></span></span></span>类属性：只在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span></span></span>中某个函数依赖的左部出现</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>：只在右出现</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">LR</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>：左右都出现</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span></span></span></span>：没有出现过</li></ul><p>步骤：</p><ul><li>求解<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">L</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>N</mi><mo separator="true">,</mo><mi>L</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">N,LR</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>类属性</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>L</mi><mo separator="true">,</mo><mi>N</mi><msup><mo stretchy="false">)</mo><mo>+</mo></msup><mo>=</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">(L,N)^+=U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.021331em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>,则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>L</mi><mo separator="true">,</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(L,N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>为唯一候选键</li><li>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>L</mi><mo separator="true">,</mo><mi>N</mi><msup><mo stretchy="false">)</mo><mo>+</mo></msup><mi mathvariant="normal">≠</mi><mi>U</mi></mrow><annotation encoding="application/x-tex">(L,N)^+\neq U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.021331em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则找<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">LR</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>类</li><li>遍历<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">LR</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>中的单一属性<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>L</mi><mo separator="true">,</mo><mi>N</mi><mo separator="true">,</mo><mi>A</mi><msup><mo stretchy="false">)</mo><mo>+</mo></msup><mo>=</mo><mi>U</mi></mrow><annotation encoding="application/x-tex">(L,N,A)^+=U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.021331em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">+</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则为候选键</li><li>如果在上一步找到所有的候选键，则算法结束。否则遍历<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex">Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span></span></span></span>中任意两个三个属性与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>L</mi><mo separator="true">,</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(L,N)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault">L</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mclose">)</span></span></span></span>构成属性组，如果新属性组不包含已有的候选键且新属性组闭包为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>U</mi></mrow><annotation encoding="application/x-tex">U</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">U</span></span></span></span>，则构成新候选键。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406231730577.png" alt="" /></p><h4 id="求最小依赖集"><a class="markdownIt-Anchor" href="#求最小依赖集"></a> 求最小依赖集</h4><ul><li>F中任一函数依赖的右部仅含有一个属性。删去重复，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>C</mi><mo separator="true">,</mo><mi>A</mi><mi>B</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A\rightarrow C,AB\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>。后者多于</li><li>F中不存在这样的函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，使得F与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>−</mo><mo stretchy="false">{</mo><mi>X</mi><mo>→</mo><mi>A</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">F-\{X\rightarrow A\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mclose">}</span></span></span></span>等价。</li><li>F中不存在这样的函数依赖<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">X\rightarrow A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>，X有真子集Z使得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>−</mo><mo stretchy="false">{</mo><mi>X</mi><mo>→</mo><mi>A</mi><mo stretchy="false">}</mo><mo>∪</mo><mrow><mi>Z</mi><mo>→</mo><mi>A</mi></mrow></mrow><annotation encoding="application/x-tex">F-\{X\rightarrow A\}\cup {Z\rightarrow A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault">A</span></span></span></span></span>与F等价。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642528.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642847.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221642533.png" alt="" /></p><h4 id="分解到3nf"><a class="markdownIt-Anchor" href="#分解到3nf"></a> 分解到3NF</h4><h5 id="保持依赖分解法"><a class="markdownIt-Anchor" href="#保持依赖分解法"></a> 保持依赖分解法</h5><ul><li>求<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span></span></span></span>的最小依赖集</li><li>将最小依赖集中不出现的组成一个关系模式</li><li>将左部相同的所有函数依赖合并组成新关系</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406231917935.png" alt="" /></p><h5 id="既保持依赖又无损分解"><a class="markdownIt-Anchor" href="#既保持依赖又无损分解"></a> 既保持依赖，又无损分解</h5><ul><li>先求出分解到3NF保持函数依赖分解</li><li>求候选键，也算是一个分解</li><li>如果有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>U</mi><mi>i</mi></msub><mo>⊆</mo><mi>X</mi></mrow><annotation encoding="application/x-tex">U_i\subseteq X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>，则将<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>U</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">U_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">U</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>从<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span>中去掉。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406231935221.png" alt="" /></p><h4 id="分解到bcnf"><a class="markdownIt-Anchor" href="#分解到bcnf"></a> 分解到BCNF</h4><p><mark>无法保证保持所有函数依赖，但保证无损连接分解</mark></p><ul><li><p>求候选码</p></li><li><p>逐个考察函数依赖</p></li><li><p>看能不能再分解</p></li></ul><blockquote><p>R(ABCDEG) F=(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>B</mi><mo separator="true">,</mo><mi>B</mi><mo>→</mo><mi>C</mi><mo separator="true">,</mo><mi>A</mi><mi>D</mi><mo>→</mo><mi>G</mi><mo separator="true">,</mo><mi>D</mi><mo>→</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">A\rightarrow B,B\rightarrow C,AD\rightarrow G,D\rightarrow E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">G</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>)</p></blockquote><ol><li>码为AD</li><li>分解，重新考察函数依赖（只放在有字母的里面，<mark><strong>传递依赖也要考虑完全！！！</strong></mark>）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>B</mi><mo stretchy="false">(</mo><mi>A</mi><mo>→</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">AB(A\rightarrow B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mopen">(</span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</span></span></span></span>  ACDEG(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>D</mi><mo>→</mo><mi>G</mi><mo separator="true">,</mo><mi>D</mi><mo>→</mo><mi>E</mi><mo separator="true">,</mo><mi>A</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">AD\rightarrow G,D\rightarrow E,A\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">G</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>)</li><li>只有两个的肯定是BCNF，不是的要考虑继续分解</li><li>ACDEG(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>D</mi><mo>→</mo><mi>G</mi><mo separator="true">,</mo><mi>D</mi><mo>→</mo><mi>E</mi><mo separator="true">,</mo><mi>A</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">AD\rightarrow G,D\rightarrow E,A\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">G</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>)的码为AD，<strong>码要重新求</strong></li><li>分解<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mo>→</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">D\rightarrow E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>为：DE(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mo>→</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">D\rightarrow E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>)    ACDG(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>D</mi><mo>→</mo><mi>G</mi><mo separator="true">,</mo><mi>A</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">AD\rightarrow G,A\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">G</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>)</li><li>重新求码为AD，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>不满足，所以要重新分解</li><li>分解为：AC(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A\rightarrow C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>)    ADG(<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>D</mi><mo>→</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">AD\rightarrow G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">G</span></span></span></span>)</li><li>最终分解为：AB，DE，AC，ADG</li></ol><h4 id="判断是否保持函数依赖"><a class="markdownIt-Anchor" href="#判断是否保持函数依赖"></a> 判断是否保持函数依赖</h4><blockquote><p>直观感知：从几个分解中寻找函数依赖，看这几个函数依赖能否推出剩下的函数依赖</p></blockquote><ul><li>由分解找到所有的函数依赖（求闭包确定所有的别落下）并在一起为G</li><li>看缺哪个函数依赖</li><li>在G中推不在的函数依赖的闭包，如果不存在则满足函数依赖</li></ul><h4 id="判断无损连接"><a class="markdownIt-Anchor" href="#判断无损连接"></a> 判断无损连接</h4><p><mark>列表法</mark>证明。</p><ul><li>每个分解占一行，是则为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">a_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，不是则为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">b_{ij}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span></li><li>逐个函数依赖，比如<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>→</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">A\rightarrow D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span>，如果有行<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo separator="true">,</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">A,D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span>都是a，则将其他<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span>已知转化为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mn>14</mn></msub></mrow><annotation encoding="application/x-tex">b_{14}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>如果只有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span>有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span>，那就把所有有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span>的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span>转化为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mn>14</mn></msub></mrow><annotation encoding="application/x-tex">b_{14}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></li><li>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mn>14</mn></msub></mrow><annotation encoding="application/x-tex">b_{14}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>能推到a,那么其他b也都能推到a</li></ul><h3 id="数据库设计"><a class="markdownIt-Anchor" href="#数据库设计"></a> 数据库设计</h3><p>🍰 实体：矩形框</p><p>🍰 属性：椭圆框并用连线连到相应实体。</p><p>🍰 联系：菱形框并用连线与有关的实体相连。</p><p>联系的元：参与联系的实体的个数。</p><p>联系的基数比约束：1：1，1：n，m：n（谁是1那边谁标1：领导1工人n）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406221105960.png" alt="" /></p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;h1 id=&quot;01-数据管理基本概念&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#01-数据管理基本概念&quot;&gt;&lt;/a&gt; 01 数据管理基本概念&lt;/h1&gt;
&lt;</summary>
      
    
    
    
    <category term="大二下" scheme="http://example.com/categories/%E5%A4%A7%E4%BA%8C%E4%B8%8B/"/>
    
    
    <category term="笔记" scheme="http://example.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="数据库" scheme="http://example.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>人工智能</title>
    <link href="http://example.com/2024/07/24/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    <id>http://example.com/2024/07/24/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/</id>
    <published>2024-07-24T15:39:47.000Z</published>
    <updated>2024-07-24T15:46:34.248Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><p>选择、填空、简答、计算</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202407232203175.png" alt="" /></p><h1 id="机器学习"><a class="markdownIt-Anchor" href="#机器学习"></a> 机器学习</h1><h2 id="分类"><a class="markdownIt-Anchor" href="#分类"></a> 分类</h2><p><strong>按数据标注情况分类：</strong></p><ul><li><p>监督学习：数据有标签，直接反馈，预测结果。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406120952866.png" alt=" " style="zoom:75%;" /></li><li><p>无监督学习：数据无标签，无反馈，寻找数据规律。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406120952079.png" alt="" style="zoom:67%;" /></li><li><p>强化学习：有良好定义，或给出回报值|惩罚值，让智能体在不同的状态下选择行为方式。</p></li></ul><p><strong>按问题分类：</strong></p><ul><li>回归问题：函数输出标量（连续）</li><li>分类问题：给定类别选择，输出一个正确选项（离散）</li></ul><h2 id="监督学习"><a class="markdownIt-Anchor" href="#监督学习"></a> 监督学习</h2><p>model：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>=</mo><mi>b</mi><mo>+</mo><mi>w</mi><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">y=b+wx_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，b——bias，w——weight，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>——feature</p><p>训练集：第<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>个标注数据记为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_{i},y_{i})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。定义一个映射函数，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span>对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的函数记为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x_{i})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</p><h3 id="损失函数"><a class="markdownIt-Anchor" href="#损失函数"></a> 损失函数</h3><p>损失函数 Loss 计算<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>真值<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>y</mi><mrow><mi>i</mi><mo stretchy="false">)</mo></mrow></msub></mrow><annotation encoding="application/x-tex">y_{i)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7857599999999999em;vertical-align:-0.3551999999999999em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.34480000000000005em;"><span style="top:-2.5198em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3551999999999999em;"><span></span></span></span></span></span></span></span></span></span>与预测值<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x_{i})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>之间的差值函数。</p><p><strong>在训练过程中优化映射函数，使得在训练数据集上得到“损失”之和最小</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><mi>n</mi><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi>L</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">min\sum_{i=1}^{n}Loss(f(x_{i}),y_{i})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406120952145.png" alt="" /></p><h3 id="经验风险与期望风险"><a class="markdownIt-Anchor" href="#经验风险与期望风险"></a> 经验风险与期望风险</h3><ul><li>经验风险：训练集中数据产生的损失。越小说明学习模型对训练数据拟合程度越好。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><mi>n</mi><mfrac><mn>1</mn><mi>n</mi></mfrac><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mi>L</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">min\frac{1}{n}\sum_{i=1}^{n}Loss(y_i,f(x_i))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></li><li>期望风险：当训练集中存在无穷多数据时产生的损失。越小，学习所得模型越好。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mo>∫</mo><mrow><mi>x</mi><mo>×</mo><mi>y</mi></mrow></msub><mi>L</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo><mi>d</mi><mi>x</mi><mi>d</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">\int_{x\times y}Loss(y,f(x))P(x,y)dxdy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.296928em;vertical-align:-0.49192800000000003em;"></span><span class="mop"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0005599999999999772em;">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.052510999999999974em;"><span style="top:-2.34418em;margin-left:-0.19445em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mbin mtight">×</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.49192800000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">L</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord mathdefault">d</span><span class="mord mathdefault">x</span><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121012511.png" alt="" /></p><p>大数定律，样本容量趋于无穷，经验风险趋于期望风险。所以实践中用经验风险估计期望风险。</p><h3 id="过学习与欠学习"><a class="markdownIt-Anchor" href="#过学习与欠学习"></a> 过学习与欠学习</h3><table><thead><tr><th>训练集上的表现</th><th>测试集上的表现</th><th>结论</th></tr></thead><tbody><tr><td>不好</td><td>不好</td><td>欠拟合</td></tr><tr><td>好</td><td>不好</td><td>过拟合</td></tr><tr><td>好</td><td>好</td><td>适度拟合</td></tr></tbody></table><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121018358.webp" alt="" style="zoom:67%;" /><p>缓解过拟合：</p><ul><li>增加训练数据量。</li><li>使用正则化。</li><li>简化模型。</li><li>限制模型复杂度。</li></ul><p>欠学习：</p><ul><li>不能过度约束。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406161725620.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121018125.png" alt="" /></p><h3 id="判别模型与生成模型"><a class="markdownIt-Anchor" href="#判别模型与生成模型"></a> 判别模型与生成模型</h3><h4 id="判别方法"><a class="markdownIt-Anchor" href="#判别方法"></a> 判别方法</h4><p>判别方法直接学习判别函数 f(x)或者条件概率分布 P(Y|X)作为预测的模型，即判别模型。</p><p><mark>关心的是对给定输入 𝑥 ，应该预测什么样的输出 𝑦 。</mark></p><img src="../../Sophomore/%E6%88%AA%E5%9B%BE/.png" alt="" style="zoom:50%;" /><h4 id="生成方法"><a class="markdownIt-Anchor" href="#生成方法"></a> 生成方法</h4><p>生成方法由数据学习输入和输出联合概率分布 𝑃(𝑥,𝑦) ，然后求出后验概率分布 𝑃(𝑦|𝑥) 作为预测的模型，即生成模型。这里以朴素贝叶斯为例，我们要求的目标可以通过：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑥</mi><mo separator="true">,</mo><mi>𝑦</mi><mo stretchy="false">)</mo><mo>=</mo><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑥</mi><mi mathvariant="normal">∣</mi><mi>𝑦</mi><mo stretchy="false">)</mo><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑦</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">𝑃(𝑥,𝑦)=𝑃(𝑥|𝑦)𝑃(𝑦)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span></span></p><p>求出输入输出的联合概率分布，然后通过贝叶斯公式：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑦</mi><mi mathvariant="normal">∣</mi><mi>𝑥</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑥</mi><mi mathvariant="normal">∣</mi><mi>𝑦</mi><mo stretchy="false">)</mo><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑦</mi><mo stretchy="false">)</mo></mrow><mrow><mi>𝑃</mi><mo stretchy="false">(</mo><mi>𝑥</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">𝑃(𝑦|𝑥)=\frac{𝑃(𝑥|𝑦)𝑃(𝑦)}{𝑃(𝑥)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>求出后验概率分布。</p><blockquote><p>可以根据山羊的特征首先学习出一个山羊模型，然后根据绵羊的特征学习出一个绵羊模型。然后从这只羊中提取特征，放到山羊模型中看概率是多少，再放到绵羊模型中看概率是多少，哪个大就是哪个。</p></blockquote><h2 id="线性回归与线性分类"><a class="markdownIt-Anchor" href="#线性回归与线性分类"></a> 线性回归与线性分类</h2><h3 id="线性回归"><a class="markdownIt-Anchor" href="#线性回归"></a> 线性回归</h3><p>回归分析：分析不同变量之间存在关系的研究。</p><h4 id="一元线性回归"><a class="markdownIt-Anchor" href="#一元线性回归"></a> 一元线性回归</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121023474.png" alt="" /></p><p>训练数据：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mo>=</mo><mo stretchy="false">{</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">D=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">}</span></span></span></span></p><p>学习模型：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>w</mi><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">f(x_i)=wx_i+b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span></p><p>损失函数:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>b</mi><mo separator="true">,</mo><mi>w</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mi>l</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mn>8</mn></msubsup><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><mo stretchy="false">(</mo><mi>w</mi><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">L(b,w)=\sum^{n}_{i=1}loss(x_i,y_i)=\sum^{8}_{i=1}(y_i-(wx_i+b))^{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.104002em;vertical-align:-0.29971000000000003em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">s</span><span class="mord mathdefault">s</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.253718em;vertical-align:-0.29971000000000003em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954008em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></p><p>优化方法：</p><p><mark><strong>最小二乘法</strong></mark>。对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>w</mi><mo separator="true">,</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">L(w,b)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span></span></span></span>参数 w，b 分别求导，令其导数值为 0，在求取 w 和 b 的取值。</p><p>对 b 求偏导：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121026162.png" alt="" /></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>b</mi><mo>=</mo><mover accent="true"><mi>y</mi><mo stretchy="true">‾</mo></mover><mo>−</mo><mi>w</mi><mover accent="true"><mi>X</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">b=\overline{y}-w\overline{X}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.825em;vertical-align:-0.19444em;"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.63056em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span><span style="top:-3.55056em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8833300000000001em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833300000000001em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span><span style="top:-3.80333em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span></p><p>对 w 求偏导：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121026030.png" alt="" /></p><p>带入得出结果。</p><h4 id="多元线性回归"><a class="markdownIt-Anchor" href="#多元线性回归"></a> 多元线性回归</h4><p><mark>数据特征维度 n：自变量个数，模型参数量为 n+1</mark></p><p>也就是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><msup><mi>a</mi><mi>T</mi></msup><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">f(x_i)=a_0+a^Tx_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.991331em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121102247.png" alt="" style="zoom: 50%;" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121026759.png" alt="" /></p><h3 id="线性分类-对数几率回归"><a class="markdownIt-Anchor" href="#线性分类-对数几率回归"></a> 线性分类-对数几率回归</h3><h4 id="sigmoid-函数-两类分类"><a class="markdownIt-Anchor" href="#sigmoid-函数-两类分类"></a> sigmoid 函数-两类分类</h4><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mi>z</mi></mrow></msup></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><mi>x</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mi mathvariant="normal">​</mi></mrow><annotation encoding="application/x-tex">y=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-(w^{T}x+b)}}​</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.09077em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.697331em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.125635em;vertical-align:-0.8041949999999999em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.279135em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8308649999999999em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7740928571428571em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">b</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8041949999999999em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">​</span></span></span></span></span></p><ul><li>概率形式输出：sigmoid 函数单调递增，值域为（0,1），输出可作为概率值。</li><li>数据特征加权累加：这里 z 是输入数据 x 和回归函数的参数 w 内积结果（可视为 x 各维度进行加权叠加）</li><li>非线性变化：在 0 附近变化幅度大。</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121035661.png" alt="" style="zoom:80%;" /><p>属于正例：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>=</mo><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo>=</mo><mn>1</mn><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><mi>x</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">y=p(y=1|x)=\frac{1}{1+e^{-(w^{T}x+b)}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.402529em;vertical-align:-0.5574209999999999em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.50091em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9844142857142858em;"><span style="top:-2.9844142857142852em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.698092857142857em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.97733em;"><span style="top:-2.97733em;margin-right:0.1em;"><span class="pstrut" style="height:2.6833299999999998em;"></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">b</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5574209999999999em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p>属于负例：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mo>=</mo><mn>0</mn><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo>−</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><msup><mi>e</mi><mrow><mo>−</mo><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><mi>x</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow></msup><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><mi>x</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">p(y=0|x)=1-f(x)=\frac{e^{-(w^{T}x+b)}}{1+e^{-(w^{T}x+b)}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.796786em;vertical-align:-0.5574209999999999em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.239365em;"><span style="top:-2.50091em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9844142857142858em;"><span style="top:-2.9844142857142852em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.698092857142857em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.97733em;"><span style="top:-2.97733em;margin-right:0.1em;"><span class="pstrut" style="height:2.6833299999999998em;"></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">b</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2076642857142859em;"><span style="top:-3.207664285714286em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.776664285714286em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0873300000000001em;"><span style="top:-3.0873299999999997em;margin-right:0.1em;"><span class="pstrut" style="height:2.6833299999999998em;"></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">b</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5574209999999999em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p>如果输入数据 x 属于正例的概率大于其属于负例的概率，即 p(y=1|x)&gt; 0.5，则输入数据 x 可被判断属于正例。</p><p>损失函数：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mi>l</mi><mi>o</mi><mi>g</mi><mo stretchy="false">(</mo><msub><mi>f</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><mi>g</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>f</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">L(\theta)=-(\sum^n_{i=1}y_ilog(f_{\theta}(x_i))+(1-y_i)log(1-f_{\theta}(x_i)))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mord">−</span><span class="mopen">(</span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p><p>优化方法：对损失函数中的所有参数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span></span></span></span>求偏导，</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>θ</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>=</mo><msub><mi>θ</mi><mi>i</mi></msub><mo>−</mo><mi>η</mi><mfrac><mrow><mi>α</mi><mi>L</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><mrow><mi>α</mi><msub><mi>θ</mi><mi>i</mi></msub></mrow></mfrac><mspace linebreak="newline"></mspace><mo>=</mo><msub><mi>θ</mi><mi>i</mi></msub><mo>−</mo><mi>η</mi><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mi>f</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta_{i+1}=\theta_{i}-\eta\frac{\alpha L(\theta)}{\alpha\theta_i}\\=\theta_{i}-\eta\sum^n_{i=1}(y_i-f_\theta(x_i)x_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.902771em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.263em;vertical-align:-0.8360000000000001em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">η</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>所有参数更新一遍：see all batches once=1 epoch</p><p>batch size*epoch=更新次数</p><h4 id="softmax-多类分类"><a class="markdownIt-Anchor" href="#softmax-多类分类"></a> softmax-多类分类</h4><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121121941.png" alt="" /></p><h2 id="线性判别分析"><a class="markdownIt-Anchor" href="#线性判别分析"></a> 线性判别分析</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121122227.png" alt="" /></p><p><strong>Fisher 线性判别分析</strong></p><p><strong>类内方差小，类间间隔大</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121134761.png" alt="" /></p><p>需要完全将这两类分开，如果直接投影到横纵坐标，这两类合适有重叠。所以需要有投影曲线。</p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为第 i 类样本的均值向量。</p><ul><li><p>最小化类内方差：最小化各个类别的协方差矩阵<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121135402.png" alt="" /></p></li><li><p>最大化类间距离：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>m</mi><mn>1</mn></msub><mo>=</mo><msup><mi>w</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">m_1=w^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8413309999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span><strong>m1</strong>,<strong><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>m</mi><mn>2</mn></msub><mo>=</mo><msup><mi>w</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">m_2=w^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8413309999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>m2</strong>。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><msub><mi>m</mi><mn>1</mn></msub><mo>−</mo><msub><mi>m</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><msup><mi mathvariant="normal">∣</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">||m_1-m_2||^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord">∣</span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord">∣</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>。</p></li></ul><p>得到最大化目标：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>w</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><msub><mi>m</mi><mn>1</mn></msub><mo>−</mo><msub><mi>m</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><msup><mi mathvariant="normal">∣</mi><mn>2</mn></msup></mrow><mrow><msub><mi>s</mi><mn>1</mn></msub><mo>+</mo><msub><mi>s</mi><mn>2</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">J(w)=\frac{||m_1-m_2||^2}{s_1+s_2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.55402em;vertical-align:-0.44509999999999994em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10892em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.485em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∣</span><span class="mord mtight">∣</span><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight">∣</span><span class="mord mtight"><span class="mord mtight">∣</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913142857142857em;"><span style="top:-2.931em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.44509999999999994em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><h2 id="svm-支持向量机"><a class="markdownIt-Anchor" href="#svm-支持向量机"></a> SVM 支持向量机</h2><h3 id="硬间隔"><a class="markdownIt-Anchor" href="#硬间隔"></a> 硬间隔</h3><p>结构风险最小化解决过学习问题。</p><p>支持向量机：寻找最佳超平面，使得每个类别中距离超平面最近的样本点到超平面的最小距离最大。</p><p>超平面：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>w</mi><mi>T</mi></msup><mi>x</mi><mo>+</mo><mi>b</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">w^Tx+b=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.924661em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>，w 为超平面的法向量，与超平面的方向有关；b 为 bias 项，标量，决定超平面到原点之间的距离。</p><p>由于法向量可任意放缩使得平面不唯一，添加约束<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>r</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi><mi mathvariant="normal">∣</mi><msup><mi>w</mi><mi>T</mi></msup><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><mi>b</mi><mi mathvariant="normal">∣</mi></mrow></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">r_{min|w^Tx_i+b|}=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8026249999999999em;vertical-align:-0.3720649999999999em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.34479999999999994em;"><span style="top:-2.502935em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span><span class="mord mtight">∣</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7740928571428571em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">b</span><span class="mord mtight">∣</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3720649999999999em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>。<mark>即例超平面最近的正负样本带入超平面方程后绝对值为 1.</mark></p><p><font color='red'>满足等号成立的样本称为支持向量</font></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121345186.png" alt="" /></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><msub><mi>n</mi><mrow><mi>w</mi><mo separator="true">,</mo><mi>b</mi></mrow></msub><mfrac><mrow><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi><msup><mi mathvariant="normal">∣</mi><mn>2</mn></msup></mrow><mn>2</mn></mfrac><mo>=</mo><mi>m</mi><mi>i</mi><msub><mi>n</mi><mrow><mi>w</mi><mo separator="true">,</mo><mi>b</mi></mrow></msub><mfrac><mn>1</mn><mn>2</mn></mfrac><msup><mi>w</mi><mi>T</mi></msup><mi>w</mi></mrow><annotation encoding="application/x-tex">min_{w,b}\frac{||w||^2}{2}=min_{w,b}\frac{1}{2}w^Tw</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.4539199999999999em;vertical-align:-0.345em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10892em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.485em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∣</span><span class="mord mtight">∣</span><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="mord mtight">∣</span><span class="mord mtight"><span class="mord mtight">∣</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913142857142857em;"><span style="top:-2.931em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span></span></span></span></p><h3 id="软间隔"><a class="markdownIt-Anchor" href="#软间隔"></a> 软间隔</h3><p>允许部分错分给定的训练样本。</p><p>条件：每个类别中距离超平面最近样本到超平面的最小距离最大，不满足约束条件的样本数目尽可能少。</p><h4 id="hinge-损失函数"><a class="markdownIt-Anchor" href="#hinge-损失函数"></a> hinge 损失函数</h4><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><msub><mi>n</mi><mrow><mi>w</mi><mo separator="true">,</mo><mi>b</mi></mrow></msub><mfrac><mn>1</mn><mn>2</mn></mfrac><msup><mi>w</mi><mi>T</mi></msup><mi>w</mi><mo>+</mo><mi>c</mi><mo>×</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi>m</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo>−</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">min_{w,b}\frac{1}{2}w^Tw+c\times\sum^{n}_{i=1}max(0,1-y_i(w^Tx_i+b))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913309999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">c</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.1413309999999999em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913309999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p><p>显然，正确分类的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">(</mo><msup><mi>w</mi><mi>T</mi></msup><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>&gt;</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">y_i(w^Tx_i+b)&gt;=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0913309999999998em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，所以值记录分类错误的损失。</p><h2 id="决策树"><a class="markdownIt-Anchor" href="#决策树"></a> 决策树</h2><p>输入特征：每个非叶子结点。输出类别：叶子结点。</p><p>树形结构中每个非叶子节点表示对分类目标在某个属性上的⼀个判断，每个 分⽀代表基于该属性做出的⼀个判断，最后树形结构中每个叶子节点代表⼀种分类结果。</p><p><mark>不断选择属性值对样本集进行划分，直至每个子样本为同一个类别</mark></p><p>经验信息熵（衡量样本集合“纯度”的指标）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(Y)=-\sum^K_{k=1}P(Y=y_k)log_2P(Y=y_k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.1304490000000005em;vertical-align:-1.302113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>条件熵：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>v</mi><mo>=</mo><mn>1</mn></mrow><mi>V</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mi mathvariant="normal">∣</mi><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mi mathvariant="normal">∣</mi><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(Y|a)=-\sum^{V}_{v=1}P(a=a^v)\sum^{K}_{k=1}P(Y=y_k|a=a^v)log_2P(Y=y_k|a=a^v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0954490000000003em;vertical-align:-1.267113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.882887em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.22222em;">V</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.267113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.1304490000000005em;vertical-align:-1.302113em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>信息增益（划分后熵的变化）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">IG(D,a)=H(Y)-H(Y|a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault">G</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span></span></p><p>属性固有值：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>v</mi><mo>=</mo><mn>1</mn></mrow><mi>V</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">IV(a)=-\sum^{V}_{v=1}P(a=a^v)log_2P(a=a^v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0954490000000003em;vertical-align:-1.267113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.882887em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.22222em;">V</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.267113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>信息增益率：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mi>a</mi><mi>i</mi><msub><mi>n</mi><mi>r</mi></msub><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">Gain_ratio(D,a)=\frac{H(Y)-H(Y|a)}{IV(a)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">G</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">o</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>例子：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121345592.png" alt="" /></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mfrac><mn>5</mn><mn>6</mn></mfrac><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mfrac><mn>5</mn><mn>6</mn></mfrac><mo>−</mo><mfrac><mn>1</mn><mn>6</mn></mfrac><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mfrac><mn>1</mn><mn>6</mn></mfrac><mo>=</mo><mn>0.65</mn></mrow><annotation encoding="application/x-tex">H(Y)=-\frac{5}{6}log_2{\frac{5}{6}}-\frac{1}{6}log_2{\frac{1}{6}}=0.65</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">5</span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><msub><mi>a</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mfrac><mn>4</mn><mn>6</mn></mfrac><mo stretchy="false">(</mo><mn>1</mn><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mn>1</mn><mo>+</mo><mn>0</mn><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mfrac><mn>2</mn><mn>6</mn></mfrac><mo stretchy="false">(</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><msub><mo><mi>log</mi><mo>⁡</mo></mo><mn>2</mn></msub><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>+</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><msub><mo><mi>log</mi><mo>⁡</mo></mo><mn>2</mn></msub><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">)</mo><mo>=</mo><mn>0.33</mn></mrow><annotation encoding="application/x-tex">H(Y|a_1)=-\frac{4}{6}(1log_21+0log_20)-\frac{2}{6}(\frac{1}{2}\log_2\frac{1}{2}+\frac{1}{2}\log_2\frac{1}{2})=0.33</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord">1</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.20696799999999996em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.20696799999999996em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">3</span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><msub><mi>a</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mfrac><mn>3</mn><mn>6</mn></mfrac><mo stretchy="false">(</mo><mn>1</mn><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mn>1</mn><mo>+</mo><mn>0</mn><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mfrac><mn>3</mn><mn>6</mn></mfrac><mo stretchy="false">(</mo><mfrac><mn>2</mn><mn>3</mn></mfrac><msub><mo><mi>log</mi><mo>⁡</mo></mo><mn>2</mn></msub><mfrac><mn>2</mn><mn>3</mn></mfrac><mo>+</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><msub><mo><mi>log</mi><mo>⁡</mo></mo><mn>2</mn></msub><mfrac><mn>1</mn><mn>3</mn></mfrac><mo stretchy="false">)</mo><mo>=</mo><mn>0.46</mn></mrow><annotation encoding="application/x-tex">H(Y|a_2)=-\frac{3}{6}(1log_21+0log_20)-\frac{3}{6}(\frac{2}{3}\log_2\frac{2}{3}+\frac{1}{3}\log_2\frac{1}{3})=0.46</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord">1</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.20696799999999996em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.20696799999999996em;"><span style="top:-2.4558600000000004em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24414em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mord">6</span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><msub><mi>a</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><msub><mi>a</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>0.65</mn><mo>−</mo><mn>0.33</mn><mo>=</mo><mn>0.32</mn></mrow><annotation encoding="application/x-tex">IG(D,a_1)=H(Y)-H(Y|a_1)=0.65-0.33=0.32</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault">G</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">3</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">2</span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><msub><mi>a</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>0.65</mn><mo>−</mo><mn>0.46</mn><mo>=</mo><mn>0.19</mn></mrow><annotation encoding="application/x-tex">IG(D,a_2)=H(Y)-H(Y|a_2)=0.65-0.46=0.19</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault">G</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">9</span></span></span></span></p><p>所以选择<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">a_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mfrac><mn>4</mn><mn>6</mn></mfrac><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mfrac><mn>4</mn><mn>6</mn></mfrac><mo>−</mo><mfrac><mn>2</mn><mn>6</mn></mfrac><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mfrac><mn>2</mn><mn>6</mn></mfrac></mrow><annotation encoding="application/x-tex">IV(a_1)=-\frac{4}{6}log_2{\frac{4}{6}}-\frac{2}{6}log_2{\frac{2}{6}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>⚠️为了避免对取值数目较少的属性有所偏好，算法通常先找出信息增益较高的属性，再从中选择增益率最高的。</p><h2 id="集成学习-ada-boost"><a class="markdownIt-Anchor" href="#集成学习-ada-boost"></a> 集成学习 Ada Boost</h2><p>核心思想：对于一个复杂的分类任务，将其分解为若干个子任务，然后将若干个子任务综合构建到一起，最终完成该复杂分类任务。</p><ul><li>初始化训练样本的权值分布，每个样本都具有相同权重。</li><li>训练弱分类器，样本正确，再下一个训练集中，他的权值被降低，反之提高。用更新过的样本集训练下一个分类器。</li><li>将所有弱分类组合成强分类器。加大分类误差率小的弱分类器权重。</li></ul><p>训练过程：</p><ul><li><p>初始化权重：最初<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>W</mi><mrow><mn>1</mn><mi>i</mi></mrow></msub><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac></mrow><annotation encoding="application/x-tex">W_{1i}=\frac{1}{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p></li><li><p>优先选择最小错误率的弱分类器</p><p><strong>错误率</strong>(如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><msub><mi>y</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">G_m(x_i)\neq y_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mo stretchy="false">(</mo><mi mathvariant="normal">.</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">I(.)=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mopen">(</span><span class="mord">.</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>)：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>w</mi><mrow><mi>m</mi><mi>i</mi></mrow></msub><mi>I</mi><mo stretchy="false">(</mo><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">err_m=\sum^{N}_{i=1}w_{mi}I(G_m(x_i)\neq y_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><mark>也就是所有错的权重加和</mark></p><p><strong>弱分类器权重</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>m</mi></msub><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mi>ln</mi><mo>⁡</mo><mfrac><mrow><mn>1</mn><mo>−</mo><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub></mrow><mrow><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">a_m=\frac{1}{2}\ln{\frac{1-err_m}{err_m}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.1574400000000002em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop">ln</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p><p><strong>更新训练样本数据分布权重</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>m</mi><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi>i</mi></mrow></msub><mo>=</mo><mfrac><msub><mi>W</mi><mrow><mi>m</mi><mo separator="true">,</mo><mi>i</mi></mrow></msub><msub><mi>Z</mi><mi>m</mi></msub></mfrac><msup><mi>e</mi><mrow><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><msub><mi>y</mi><mi>i</mi></msub><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.24999999999999992em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mfrac><msub><mi>W</mi><mrow><mi>m</mi><mo separator="true">,</mo><mi>i</mi></mrow></msub><msub><mi>Z</mi><mi>m</mi></msub></mfrac><mi>e</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>y</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mfrac><msub><mi>W</mi><mrow><mi>m</mi><mo separator="true">,</mo><mi>i</mi></mrow></msub><msub><mi>Z</mi><mi>m</mi></msub></mfrac><mi>e</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><msub><mi>y</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">w_{m+1,i}=\frac{W_{m,i}}{Z_m}e^{-a_my_iG_m(x_i)}=\left\{\begin{aligned}\frac{W_{m,i}}{Z_m}exp(-a_m),   G_m(x_i)=y_i  \\\frac{W_{m,i}}{Z_m}exp(a_m),   G_m(x_i)\neq y_i \\\end{aligned}\right.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.19633em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:4.992660000000001em;vertical-align:-2.2463300000000004em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65002em;"><span style="top:-1.8999899999999998em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-1.8999899999999998em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-2.1999899999999997em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-3.15001em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.30001em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-4.60001em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-4.90002em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.7463300000000004em;"><span style="top:-4.74633em;"><span class="pstrut" style="height:3.3603300000000003em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.3603300000000003em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.2463300000000004em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>Z</mi><mi>m</mi></msub><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></msubsup><msub><mi>w</mi><mrow><mi>m</mi><mi>i</mi></mrow></msub><mi>e</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Z_m=\sum^{N}_{i=1}w_{mi}exp(-a_my_i,G_m(x_i))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2809409999999999em;vertical-align:-0.29971000000000003em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.981231em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></p><p><mark>实质就是乘 exp（+&amp;-）弱分类器权重后，再进行归一化使其加和为 1</mark></p></li><li><p>组合得到强分类器：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>1</mn></mrow></msub><mi>A</mi><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>2</mn></mrow></msub><mi>B</mi><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>3</mn></mrow></msub><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(x)=sign(a_{m1}A+a_{m2}B+a_{m3}C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">s</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">n</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span></span></span></span></span></p></li></ul><h1 id="深度学习"><a class="markdownIt-Anchor" href="#深度学习"></a> 深度学习</h1><h2 id="梯度下降"><a class="markdownIt-Anchor" href="#梯度下降"></a> 梯度下降</h2><p>gradient descent（<mark><strong>梯度下降</strong></mark>）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121111262.png" alt="" /></p><p>求 Loss 函数斜率，为正则向左，为负则向右，直到找到为 0。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>w</mi><mn>1</mn></msup><mo>←</mo><msup><mi>w</mi><mn>0</mn></msup><mo>−</mo><mi>η</mi><mfrac><mrow><mi>α</mi><mi>L</mi></mrow><mrow><mi>α</mi><mi>w</mi></mrow></mfrac><msub><mi>I</mi><mrow><mi>w</mi><mo>=</mo><msup><mi>w</mi><mn>0</mn></msup></mrow></msub><mo separator="true">,</mo><mi>η</mi><mi mathvariant="normal">为</mi><mi mathvariant="normal">学</mi><mi mathvariant="normal">习</mi><mi mathvariant="normal">率</mi></mrow><annotation encoding="application/x-tex">w^1\leftarrow w^0-\eta\frac{\alpha L}{\alpha w}I_{w=w^0},\eta为学习率</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8641079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.9474379999999999em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.04633em;vertical-align:-0.686em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">η</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord mathdefault">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.52238em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="mrel mtight">=</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463142857142857em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.17762em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">η</span><span class="mord cjk_fallback">为</span><span class="mord cjk_fallback">学</span><span class="mord cjk_fallback">习</span><span class="mord cjk_fallback">率</span></span></span></span></span></p><ul><li>单变量：目标函数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mi>θ</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">J(\theta)=\theta^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>，则为微分为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>w</mi></mrow><annotation encoding="application/x-tex">2w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span></span></span></span>，起点为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>θ</mi><mn>0</mn></msup><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\theta^0=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>。则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>θ</mi><mn>1</mn></msup><mo>=</mo><msup><mi>θ</mi><mn>0</mn></msup><mo>−</mo><mn>0.4</mn><mo>×</mo><mn>2</mn><mo>=</mo><mn>0.2</mn></mrow><annotation encoding="application/x-tex">\theta^1=\theta^0-0.4\times2=0.2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.897438em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">2</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>θ</mi><mn>2</mn></msup><mo>=</mo><msup><mi>θ</mi><mn>1</mn></msup><mo>−</mo><mn>0.4</mn><mo>×</mo><mn>0.4</mn><mo>=</mo><mn>0.04</mn></mrow><annotation encoding="application/x-tex">\theta^2=\theta^1-0.4\times0.4=0.04</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.897438em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">4</span></span></span></span>，以此类推。</li><li>多变量：目标函数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mi>θ</mi><mn>1</mn><mn>2</mn></msubsup><mo>+</mo><msubsup><mi>θ</mi><mn>2</mn><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">J(\theta)=\theta_1^2+\theta_2^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.0622159999999998em;vertical-align:-0.24810799999999997em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-2.4518920000000004em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24810799999999997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.0622159999999998em;vertical-align:-0.24810799999999997em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-2.4518920000000004em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.24810799999999997em;"><span></span></span></span></span></span></span></span></span></span>，则微分为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">△</mi><mi>J</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mo>&lt;</mo><mn>2</mn><msub><mi>θ</mi><mn>1</mn></msub><mo separator="true">,</mo><mn>2</mn><msub><mi>θ</mi><mn>2</mn></msub><mo>&gt;</mo></mrow><annotation encoding="application/x-tex">\triangle J(\theta)=&lt;2\theta_1,2\theta_2&gt;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>θ</mi><mn>0</mn></msup><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta^0=(1,3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span><span class="mclose">)</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>θ</mi><mn>1</mn></msup><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo stretchy="false">)</mo><mo>−</mo><mn>0.1</mn><mo>×</mo><mo stretchy="false">(</mo><mn>2</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mn>0.8</mn><mo separator="true">,</mo><mn>2.4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta^1=(1,3)-0.1\times(2,6)=(0.8,2.4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">6</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0</span><span class="mord">.</span><span class="mord">8</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mord">.</span><span class="mord">4</span><span class="mclose">)</span></span></span></span>，以此类推。</li></ul><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">θ</span></span></span></span> 代表所有参数，如果是在线性回归中，所有的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>w</mi><mo separator="true">,</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">w,b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span></span></span></span> 在每次更新中都要进行上述操作。</p><h2 id="前馈神经网络"><a class="markdownIt-Anchor" href="#前馈神经网络"></a> 前馈神经网络</h2><h3 id="引入"><a class="markdownIt-Anchor" href="#引入"></a> 引入</h3><p>这条蓝色的线可以拟合任何折线|曲线：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121028470.png" alt="" style="zoom: 33%;" /><p>简单的一元线性回归到多元线性回归：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121038917.png" alt="" style="zoom: 50%;" /><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121039102.png" alt="" style="zoom:67%;" /><p>即矩阵运算：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121415768.png" alt="" style="zoom: 50%;" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121416769.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121416423.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121416503.png" alt="" /></p><p>引入多层，注意<strong>这里的 w 和 b 每层是不一样的</strong>！</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121424552.png" alt="" /></p><h3 id="内容"><a class="markdownIt-Anchor" href="#内容"></a> 内容</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121426765.png" alt="" /></p><p>只包括输入层、隐藏层和输出层。</p><p><strong>输入数据与第一个隐藏层所有的神经元相互连接</strong></p><p>每层神经元只和相邻层神经元相联。两个相邻层之间的神经元完全成对连接，但层内的神经元不相互连接。<mark>全连接</mark></p><p><strong>神经元</strong>：线性加权求和，&gt;0 输出 1，&lt;0 输出-1，解决二分类。</p><p><strong>激活函数</strong>：使用非线性函数，对多个非线性函数进行组合，实现对输入信息的非线性转换。</p><ul><li><p><strong>sigmoid</strong>：在使用反向传播算法更新参数过程易出现导数过于接近 0 的情况，即梯度小时，并且随着网络深度增加会更加严重。</p></li><li><p><strong>tanh</strong>：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mn>1</mn><mo>−</mo><msup><mi>e</mi><mrow><mo>−</mo><mn>2</mn><mi>x</mi></mrow></msup></mrow><mrow><mn>1</mn><mo>+</mo><msup><mi>e</mi><mrow><mo>−</mo><mn>2</mn><mi>x</mi></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">f(x)=\frac{1-e^{-2x}}{1+e^{-2x}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.4212509999999998em;vertical-align:-0.403331em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.01792em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463142857142857em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span><span class="mord mathdefault mtight">x</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913142857142857em;"><span style="top:-2.931em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span><span class="mord mathdefault mtight">x</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.403331em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，在定义域单调递增，值域为（-1,1）。tanh 函数在原点梯度更大，使用更容易收敛。同样有梯度小时问题。</p></li><li><p><strong>ReLU</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.24999999999999992em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mn>0</mn><mo separator="true">,</mo><mi>x</mi><mo>&lt;</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>x</mi><mo separator="true">,</mo><mi>x</mi><mo>≥</mo><mn>0</mn></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">f(x)=\left\{\begin{aligned}0,x&lt;0  \\x,x\geq0 \\\end{aligned}\right.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.00003em;vertical-align:-1.25003em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size4">{</span></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7500000000000002em;"><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000002em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>大于等于 0 导数为常数，克服梯度消失问题，小于 0 总是 0，参与分类等任务的神经元稀疏，克服过拟合。</p></li><li><p><strong>softmax</strong>：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>y</mi><mi>i</mi></msub><mo>=</mo><mfrac><msup><mi>e</mi><msub><mi>x</mi><mi>i</mi></msub></msup><mrow><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></msubsup><msup><mi>e</mi><msub><mi>x</mi><mi>j</mi></msub></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">y_i=\frac{e^{x_i}}{\sum^{K}_{j=1}e^{x_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.6628720000000001em;vertical-align:-0.751892em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.91098em;"><span style="top:-2.570335em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight"><span class="mop op-symbol small-op mtight" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8852357142857143em;"><span style="top:-2.1785614285714283em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-2.8971428571428572em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.46032428571428574em;"><span></span></span></span></span></span></span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7789785714285715em;"><span style="top:-2.9714357142857146em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3448em;margin-left:0em;margin-right:0.1em;"><span class="pstrut" style="height:2.65952em;"></span><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5091600000000001em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7385428571428572em;"><span style="top:-2.931em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3448em;margin-left:0em;margin-right:0.1em;"><span class="pstrut" style="height:2.65952em;"></span><span class="mord mathdefault mtight">i</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.31472em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，同样值域(-1,1）</p></li></ul><p><strong>损失函数</strong>：</p><ul><li><p><strong>均方误差</strong>：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mi>S</mi><mi>E</mi><mo>=</mo><mfrac><mn>1</mn><mi>n</mi></mfrac><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">MSE=\frac{1}{n}\sum^n_{i=1}(y_i-\hat y_i)^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.19444em;">^</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></p></li><li><p><strong>交叉熵</strong>：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>p</mi><mo separator="true">,</mo><mi>q</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mo stretchy="false">(</mo><mi>p</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi>log</mi><mo>⁡</mo><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(p,q)=-\sum_{i=1}^n(p(x_i)\log q(x_i))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault">p</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.104002em;vertical-align:-0.29971000000000003em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.804292em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>p</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p(x_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>为真实分布的概率，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>q</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q(x_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>为机器预测的概率分布。为了实现不同类别的模型比较——统一的比较方式熵（不确定到确定的难度）。</p><p>求熵：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121452276.png" alt="" /></p><p><strong>p 和 q 是两个概率模型！！！</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121458181.png" alt="" /></p><p>是猫*机器判断是猫的概率+不是猫*机器判断不是猫的概率</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121513952.png" alt="" style="zoom:50%;" /></li></ul><h2 id="卷积神经网络-cnn"><a class="markdownIt-Anchor" href="#卷积神经网络-cnn"></a> 卷积神经网络 CNN</h2><blockquote><p>善于图像识别</p></blockquote><h3 id="解释版本-1"><a class="markdownIt-Anchor" href="#解释版本-1"></a> 解释版本 1</h3><p>输入：三维张量（维数大于 2 的矩阵）——图片的长，宽，和 rgb 三个颜色通道</p><p>矩阵中每个数值：颜色的强度</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121511275.png" alt="" /></p><p><mark>每个 neural 无需覆盖整个图像，看 pattern（特征：嘴…）</mark></p><p>每个 neural 关注一个<strong>感受野</strong> <strong><font color='orange'>自定义的！！</font></strong>（receptive field 之间可重叠，感受野大小不同，通道数不同，非正方形）：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121527735.png" alt="" /></p><p><strong>捕捉到图像中的局部特征而不受其位置的影响</strong></p><p>卷积核：有一组固定的权重（可以理解为要找的目标值）。</p><p>通过卷积核与图像（<strong>感受野</strong>：输入图像中该点及其领域区域点的取值）进行逐元素相乘然后相加。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121535056.png" alt="" /></p><ul><li>步长：每次滑动的位置步长</li><li>卷积核大小 ：changjian <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn><mo>×</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">3\times3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span></li><li>填充值 padding：在外围边缘补充若干圈 0，方便从初始位置以步长为单位可以刚好滑到末尾位置，通俗地讲就是为了总长能被步长整除。</li></ul><h4 id="典型设置"><a class="markdownIt-Anchor" href="#典型设置"></a> 典型设置</h4><ul><li><p>每个感受野对应多个 neural</p></li><li><p>共享参数：不同感受野的神经元共享参数（filter，滤波器），即 weight 一模一样。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121539974.png" alt="" style="zoom:67%;" /></li></ul><h3 id="解释版本-2"><a class="markdownIt-Anchor" href="#解释版本-2"></a> 解释版本 2</h3><p>有多个 filter（其中的数值为待学习的未知参数），不断滑动生成 64 层的 feature map 特征图（可以看成一个新的图片），第二层的 filter 则为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn><mo>×</mo><mn>3</mn><mo>×</mo><mn>64</mn></mrow><annotation encoding="application/x-tex">3\times3\times64</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">6</span><span class="mord">4</span></span></span></span>。filter 的高度就是影响的 channel。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121548382.png" alt="" style="zoom:67%;" /><blockquote><p>Q：如果想捕捉图像中较大感受野的 pattern，比如鸟嘴， 3x3 大小的卷积核是否足够？为什么？</p><p>A：不会。第二层时<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn><mo>×</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">3\times3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span>实质对应着原始图像是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>5</mn><mo>×</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">5\times5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span></span></span></span>（如果步长为 1），所以会捕捉到。</p></blockquote><h3 id="池化"><a class="markdownIt-Anchor" href="#池化"></a> 池化</h3><p>降采样——一组选一个最大|最小|平均把图像变小。</p><p>convolution——pooling 交替运行</p><blockquote><p>CNN 中的卷积操作不满足尺度和旋转不变性（需要数据增广）</p></blockquote><h2 id="序列数据模型"><a class="markdownIt-Anchor" href="#序列数据模型"></a> 序列数据模型</h2><h3 id="向量集输入"><a class="markdownIt-Anchor" href="#向量集输入"></a> 向量集输入</h3><p>多个向量输入，变长序列</p><p>单词 eg：</p><ul><li>One-hot Encoding：开一个全世界所有词汇数大小的向量，index=0 处为 1 表示 apple</li><li>Word Embedding（有语义）：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121631447.png" alt="" style="zoom:50%;" /></li></ul><p>语音（定长描述为一个向量），图数据（每个结点描述为一个向量），分子</p><h3 id="输出"><a class="markdownIt-Anchor" href="#输出"></a> 输出</h3><ul><li><p>一对一输出（文字处理，语音识别，图）：每个向量对应一个 label<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121634310.png" alt="" style="zoom: 30%;" /></p></li><li><p>多对一输出（判断评价）：多个向量对应一个输出<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121635134.png" alt="" style="zoom:33%;" /></p></li><li><p>多对多输出：机器自己决定<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121637011.png" alt="" style="zoom:33%;" /></p></li></ul><p>一对一输出：</p><blockquote><p>Q:每个向量放入全连接？——同样的东西输出相同？——上下文信息？</p><p>A:将相邻的上下文作为一个 window 放入全连接</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121639033.png" alt="" /></p><p>想要考虑整个 sequence（不定长？）windows 开非常大，参数很多且容易 overfit。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>↓</mo></mrow><annotation encoding="application/x-tex">\downarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mrel">↓</span></span></span></span> self-attention 解决</p></blockquote><h2 id="深度学习应用"><a class="markdownIt-Anchor" href="#深度学习应用"></a> 深度学习应用</h2><p>优化问题：加深网络无法得到更小的训练损失。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121724758.png" alt="" /></p><h3 id="自注意力机制"><a class="markdownIt-Anchor" href="#自注意力机制"></a> 自注意力机制</h3><h4 id="使用场景"><a class="markdownIt-Anchor" href="#使用场景"></a> 使用场景</h4><p>输入一整个 sequence，考虑整个句子后然后得到同样多个向量，然后丢进全连接（full connect），出来后再 attention+FC 一次</p><p><mark>self-attention 处理整个句子上下文</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121645312.png" alt="" /></p><h4 id="原理"><a class="markdownIt-Anchor" href="#原理"></a> 原理</h4><p><mark>Q 表示查询向量，K 表示关键向量，V 表示数值向量。</mark></p><ul><li><p>从 input 中找出跟<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">a_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>相关的向量，考虑整个句子，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span></span></span></span> 作为关联度？</p><blockquote><p>求关联度：</p><ul><li>dot-product：两个向量分别乘不同的矩阵然后再点乘</li><li>additive：两个向量分别乘不同的矩阵，串起来然后 tanh</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121701165.png" alt="" style="zoom:50%;" /></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121649846.png" alt="" /></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121703912.png" alt="" style="zoom:50%;" /></li><li><p>根据 attention score 抽取重要信息，将<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>a</mi><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">a^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.824664em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.824664em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span></span></span></span></span></span></span>乘<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>w</mi><mi>v</mi></msup></mrow><annotation encoding="application/x-tex">w^v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.664392em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span></span></span></span>然后，让其与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>a</mi><mrow><mn>1</mn><mo separator="true">,</mo><mn>1</mn></mrow><mo mathvariant="normal">′</mo></msubsup></mrow><annotation encoding="application/x-tex">a_{1,1}&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.136108em;vertical-align:-0.38421599999999995em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-2.4518920000000004em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.38421599999999995em;"><span></span></span></span></span></span></span></span></span></span>相乘然后结果相加（<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">b_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的求解是同时进行的）<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121706754.png" alt="" /></p></li></ul><p>矩阵角度：</p><p>拼起来一次性求解</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121709703.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192110305.png" alt="" /></p><blockquote><p>以上所有的单词都是同等地位的，缺失了位置信息</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192113894.png" alt="" /></p><h4 id="位置编码"><a class="markdownIt-Anchor" href="#位置编码"></a> 位置编码</h4><ul><li><p>公共设计为每个位置设置一个位置向量<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>e</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">e_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406121716161.png" alt="" style="zoom:50%;" /></p></li><li><p>从数据中学习的</p></li></ul><blockquote><p>CNN vs self-attention：</p><p>CNN：感受野</p><p>self-attention：上下文为整张图像</p></blockquote><h4 id="应用"><a class="markdownIt-Anchor" href="#应用"></a> 应用</h4><p>seq2seq：输入输出均为序列，输出序列的长度由模型来确定</p><p>语音识别，翻译，语音翻译，语音合成，聊天机器人</p><p>怎么做：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>↓</mo></mrow><annotation encoding="application/x-tex">\downarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mrel">↓</span></span></span></span></p><h3 id="transformer"><a class="markdownIt-Anchor" href="#transformer"></a> Transformer</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122006816.png" alt="" /></p><h4 id="encoder"><a class="markdownIt-Anchor" href="#encoder"></a> Encoder</h4><p>输入一排向量，输出一排向量。实际上 RNN，CNN 都可以实现，Transformer 中用的是 self-attention。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122009878.png" alt="" /></p><p>这里的 block 不能等同于 layer，而是相当于好几层 layer 做的事情。self-attention——FC。</p><p>实际 Transformer 中使用的 encoder：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122012912.png" alt="" /></p><p>进行 self-attention 时，将输出的 a 再用 residual 加上原来 input 的 b，在进行 layer norm 标准化；FC 中同时也要加上 FC 输入的向量，然后 norm。</p><h4 id="decoder"><a class="markdownIt-Anchor" href="#decoder"></a> Decoder</h4><h5 id="autoregressive-at"><a class="markdownIt-Anchor" href="#autoregressive-at"></a> Autoregressive (AT)</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122020451.png" alt="" /></p><p>encoder 的输出向量输入到 decoder 中，同时输入 start 的特殊 token 代表输出开始，第一个输出的向量经过了 softmax，是一个包含全中文字符的向量表（概率最高的就是输出的字）。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122022561.png" alt="" /></p><p>然后将第一个输出的向量作为额外输入到 decoder 中。</p><p>Transformer 的 Decoder：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122025153.png" alt="" style="zoom:67%;" /><p>Masked-self-attention 在输出时隐藏在其之后的向量，输出一个一个产生。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122041929.png" alt="" /></p><h6 id="何时停下来"><a class="markdownIt-Anchor" href="#何时停下来"></a> 何时停下来？</h6><p>在中文表中增加一个 END 的段，如果这个概率最高就结束了。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122043804.png" alt="" /></p><h5 id="non-autoregressive-nat"><a class="markdownIt-Anchor" href="#non-autoregressive-nat"></a> Non-autoregressive (NAT)</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122044778.png" alt="" /></p><p>如何知道输出长度？</p><ul><li>额外一个预测器预测输出的长度</li><li>输出一个足够长的序列，取 END token 前的部分</li></ul><p>优点：并行，可控生成长度，生成稳定</p><p>缺点：通常比 AT 差</p><h4 id="encoder-decoder"><a class="markdownIt-Anchor" href="#encoder-decoder"></a> Encoder-Decoder</h4><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122047199.png" alt="" style="zoom:67%;" /><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122056877.png" alt="" /></p><h4 id="training"><a class="markdownIt-Anchor" href="#training"></a> Training</h4><p>事先输入 ground truth，获得每个字的读音。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122058695.png" alt="" /></p><p>在输入时给正确答案 ground truth。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406122059130.png" alt="" /></p><h3 id="bert"><a class="markdownIt-Anchor" href="#bert"></a> Bert</h3><p>Encoder 的架构与 Transformer 相同。</p><h4 id="mask-input"><a class="markdownIt-Anchor" href="#mask-input"></a> Mask Input</h4><p>看左右两边的 sequence，掩盖要预测的，使用 mask（special token）或者 random token 实现。使用的 Transformer 没有任何限制（可以读取之后的向量）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131115794.png" alt="" /></p><h4 id="next-sentence-prediction"><a class="markdownIt-Anchor" href="#next-sentence-prediction"></a> Next Sentence Prediction</h4><p>读入两个句子，用 sep 连接，然后只读取 CLS 输出的向量，判断这两个句子是不是连接的。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131118494.png" alt="" style="zoom:50%;" /><p>通过 pre-train 生成做“填空题”的 Bert 模型，通过微调，实际可以完成与其无关的下游任务 downstream tasks</p><h4 id="微调-fine-tune"><a class="markdownIt-Anchor" href="#微调-fine-tune"></a> 微调 Fine-tune</h4><h5 id="case1-输入句子输出类别"><a class="markdownIt-Anchor" href="#case1-输入句子输出类别"></a> Case1 输入句子输出类别</h5><p>只关注 CLS 输出的向量，经过 softmax（图上省略）输出类别。</p><p>用已经经过 pre-train 的 Bert（**不是随机初始化的！！**是已经会做填空题的）加上一些 Sentence+判断类别的标注资料微调。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131130358.png" alt="" /></p><h5 id="case2-输入句子输出句子词性标注"><a class="markdownIt-Anchor" href="#case2-输入句子输出句子词性标注"></a> Case2 输入句子输出句子（词性标注）</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131132893.png" alt="" /></p><h5 id="case3-输入多个句子输出一个类别"><a class="markdownIt-Anchor" href="#case3-输入多个句子输出一个类别"></a> Case3 输入多个句子输出一个类别</h5><p>NLI 判断：从前提是否可以得出假设，是否矛盾。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131135802.png" alt="" /></p><h5 id="case4-回答问题答案为给出的文章片段"><a class="markdownIt-Anchor" href="#case4-回答问题答案为给出的文章片段"></a> Case4 回答问题（答案为给出的文章片段）</h5><p>输入文章和问题，输出两个正整数，根据索引从文章中截取</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131137666.png" alt="" /></p><p>只需训练两个向量，即起始位置和结束位置：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131140356.png" alt="" /></p><h4 id="工作原理"><a class="markdownIt-Anchor" href="#工作原理"></a> 工作原理</h4><p>不同语境下的同一个字 bert 出的向量不一样，根据语境</p><h3 id="gpt"><a class="markdownIt-Anchor" href="#gpt"></a> GPT</h3><p>省去 find to 的过程。小样本学习，单样本学习，零样本学习</p><p>使用者输入即直接给模型输入：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131102023.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131111179.png" alt="" /></p><h1 id="无监督学习"><a class="markdownIt-Anchor" href="#无监督学习"></a> 无监督学习</h1><h2 id="k-均值聚类"><a class="markdownIt-Anchor" href="#k-均值聚类"></a> k 均值聚类</h2><p>n 个无标注信息的数据聚类到 k 个集合。</p><p>n 个 m 维数据</p><p>两个 m 维数据的欧氏距离：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>d</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>x</mi><mi>j</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msqrt><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>i</mi><mn>1</mn></mrow></msub><mo>−</mo><msub><mi>x</mi><mrow><mi>j</mi><mn>1</mn></mrow></msub><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>i</mi><mn>2</mn></mrow></msub><mo>−</mo><msub><mi>x</mi><mrow><mi>j</mi><mn>2</mn></mrow></msub><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo>+</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>i</mi><mi>m</mi></mrow></msub><mo>−</mo><msub><mi>x</mi><mrow><mi>j</mi><mi>m</mi></mrow></msub><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></msqrt></mrow><annotation encoding="application/x-tex">d(x_i,x_j)=\sqrt{(x_{i1}-x_{j1})^2+(x_{i2}-x_{j2})^2+...+(x_{im}-x_{jm})^2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord mathdefault">d</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.84em;vertical-align:-0.574179em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.265821em;"><span class="svg-align" style="top:-3.8em;"><span class="pstrut" style="height:3.8em;"></span><span class="mord" style="padding-left:1em;"><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">m</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mord mathdefault mtight">m</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:-3.225821em;"><span class="pstrut" style="height:3.8em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.8800000000000001em;"><svg width='400em' height='1.8800000000000001em' viewBox='0 0 400000 1944' preserveAspectRatio='xMinYMin slice'><path d='M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10zM1001 80H400000v40H1013z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.574179em;"><span></span></span></span></span></span></span></span></span></span></p><p>越小越相似。</p><ul><li>初始化：选择 k 个分散的数据作为聚类质心</li><li>对数据进行聚类：计算欧式距离，放入距离最近的聚类质心的集合中</li><li>更新聚类质心：根据集合中所有点取平均，如果变化很小或没有改变则结束</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131530854.gif" alt="在这里插入图片描述" /></p><blockquote><p>不足：</p><ul><li>需要实现确定聚类数目</li><li>需要初始化聚类质心，且其对结果有较大影响</li><li>迭代执行，开销大</li></ul></blockquote><h2 id="主成分分析"><a class="markdownIt-Anchor" href="#主成分分析"></a> 主成分分析</h2><p>特征降维方法：数据应向方差最大的方向进行投影，使得数据所蕴含的信息没有丢失。</p><p>红优于绿</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131534158.png" alt="" /></p><p>主要思想：将 n 维特征数据映射到<code>i</code>维空间中，去除原始数据之间的冗余性。</p><blockquote><p>协方差：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>c</mi><mi>o</mi><mi>v</mi><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>n</mi></mfrac><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo>−</mo><mi>E</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><mi>E</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">cov(X,Y)=\frac{1}{n}\sum^n_{i=1}(x_i-E(X))(y_i-E(Y))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">c</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">n</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p><p>衡量两个变量之间的相关度</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131912785.png" alt="" /></p><p>算法过程：</p><ul><li>数据预处理 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub><mo>=</mo><mfrac><mrow><msub><mi>x</mi><mi>i</mi></msub><mo>−</mo><mi>μ</mi></mrow><mi>σ</mi></mfrac></mrow><annotation encoding="application/x-tex">x_i=\frac{x_i-\mu}{\sigma}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.199439em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.854439em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.446108em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord mathdefault mtight">μ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span> 。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>μ</mi></mrow><annotation encoding="application/x-tex">\mu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">μ</span></span></span></span> 为平均值， <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span> 为标准差。</li><li>计算样本的协方差矩阵 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></mfrac><msup><mi>X</mi><mi>T</mi></msup><mi>X</mi></mrow><annotation encoding="application/x-tex">\frac{1}{n-1}X^TX</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2484389999999999em;vertical-align:-0.403331em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.403331em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span></li><li>求得协方差矩阵的特征向量和特征根</li><li>取前 I 个最大特征根所对应的特征向量组成映射矩阵</li></ul><p><img src="https://img-blog.csdnimg.cn/20190907122319700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjYyMjY2,size_16,color_FFFFFF,t_70" alt="img" /></p><h1 id="生成式人工智能"><a class="markdownIt-Anchor" href="#生成式人工智能"></a> 生成式人工智能</h1><p>同一输入可以有不同的输出</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131915471.png" alt="" /></p><h2 id="自编码器"><a class="markdownIt-Anchor" href="#自编码器"></a> 自编码器</h2><p>尽可能重建。输入的图片降维转为向量后再转回高维图片</p><p>用于下游任务</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131927741.png" alt="" /></p><p>化繁为简：如何从<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mo>×</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">2\times2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>生成<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn><mo>×</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">3\times3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span> 的图片向量？</p><p>如果只有两种，那么只需要 0,1 两种状态即可表示。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131935581.png" alt="" /></p><p>可能图片出来的样式只能几种，通过压缩来实现</p><p><strong>生成模型</strong></p><ul><li>无条件生成：通过简单的分布获得高维向量的复杂分布</li><li>带条件生成：上面的情况增加条件</li></ul><h2 id="变分自编码器"><a class="markdownIt-Anchor" href="#变分自编码器"></a> 变分自编码器</h2><p><a href="https://blog.csdn.net/DongxueB/article/details/124261991">VAE 变分自动编码_vae 李宏毅-CSDN 博客</a></p><blockquote><p>去噪自编码器：输入加入噪点的，输出没有噪点的——联系 Bert 中的 mask 就是一种 embedding</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406131939932.png" alt="" /></p></blockquote><p>变分自编码器：</p><p>如果一张半月一张满月，期待生成 3/4 月的图，但使用自编码器是失真图，所以我们引入噪声，掩盖失真的空白编码点。把噪音无限拉长，使得对于每一个样本，它的编码会覆盖整个编码空间，不过我们得保证，在原编码附近编码的概率最高，离原编码点越远，编码概率越低。图像的编码就由原先离散的编码点变成了一条<strong>连续的编码分布曲线</strong>：</p><p><img src="https://img-blog.csdnimg.cn/img_convert/5b47cb9c20dae72d32ae4bd9c55304c9.png" alt="" /></p><p><mark>核心思想：将图像编码由离散变为连续</mark></p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：直接产生原有的编码</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span> ：控制噪音干扰程度的编码，为随机噪音码分配权重。exp 确认权重是正值 (要对他做限制，有最小值)</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">c_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：加入噪点的图像编码</li></ul><p>为了保证图片质量高，肯定希望噪音对自身生成图片的影响小，所以分配权重小，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span> 无限区域负无穷。就有限制编码器走这样极端路径的作用，这也从直观上就能看出来，exp()-(1+)在=0 处取得最小值，于是()就会避免被赋值为负无穷大。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132015483.png" alt="" /></p><h3 id="高斯混合模型"><a class="markdownIt-Anchor" href="#高斯混合模型"></a> 高斯混合模型</h3><blockquote><p>任何一个数据的分布，都可以看做若干高斯分布的叠加。</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132024408.png" alt="" /></p><p><strong>直接用每一组高斯分布的参数作为一个编码值实现编码</strong></p><p>则原始的分布 P（X）为：（P（x|m）为结合的几率）</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo>∑</mo><mi>n</mi></munder><mi>P</mi><mo stretchy="false">(</mo><mi>m</mi><mo stretchy="false">)</mo><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sum_{n}P(m)P(x|m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.3000100000000003em;vertical-align:-1.250005em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8999949999999999em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250005em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">m</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault">m</span><span class="mclose">)</span></span></span></span></span></p><p>这种编码方式对应的是之前提到的离散的、有大量失真区域的编码方式，需要改进成为连续有效的编码，z~N(0,1)，如下面所示：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mo>∫</mo><mi>z</mi></msub><mi>P</mi><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo><mi>d</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">P(x)=\int_{z}P(z)P(x|z)dz</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.27195em;vertical-align:-0.9119499999999999em;"></span><span class="mop"><span class="mop op-symbol large-op" style="margin-right:0.44445em;position:relative;top:-0.0011249999999999316em;">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:-0.6105579999999999em;"><span style="top:-1.7880500000000001em;margin-left:-0.44445em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9119499999999999em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192210717.png" alt="" /></p><p>由于 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span> 是一致的，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x|z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span></span></span></span> 未知，而<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi mathvariant="normal">∣</mi><mi>z</mi><mo>∼</mo><mi>N</mi><mo stretchy="false">(</mo><mi>μ</mi><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>σ</mi><mo stretchy="false">(</mo><mi>z</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x|z\sim N(\mu(z),\sigma(z))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord mathdefault">μ</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span> ，要求解的是 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>μ</mi></mrow><annotation encoding="application/x-tex">\mu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">μ</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span> 两个函数的表达式。但是过于复杂，所以引入两个神经网络。</p><ul><li>Decoder：求解 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>μ</mi></mrow><annotation encoding="application/x-tex">\mu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">μ</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span></span></span></span> 两个函数</li><li>Encoder：求解 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>q</mi><mo stretchy="false">(</mo><mi>z</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q(z|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span> ,q 可以代表任何分布</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132029345.png" alt="" /></p><p>我们希望 P(x)越大越好，这等价于求解 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>a</mi><mi>x</mi><mi>i</mi><mi>m</mi><mi>u</mi><mi>m</mi><mi>L</mi><mo>=</mo><msub><mo>∑</mo><mi>x</mi></msub><mi>l</mi><mi>o</mi><mi>g</mi><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">maximum L=\sum_xlogP(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mord mathdefault">i</span><span class="mord mathdefault">m</span><span class="mord mathdefault">u</span><span class="mord mathdefault">m</span><span class="mord mathdefault">L</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.0497100000000001em;vertical-align:-0.29971000000000003em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.0016819999999999613em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span>。</p><p><img src="https://img-blog.csdnimg.cn/fe1e4bbc89e14ee88db16fd67c61ca98.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARG9uZ3h1ZV9OTFA=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192217446.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192218952.png" alt="" /></p><blockquote><p>VAE 本质没有学习生成真实图像，VAE 可能只是对训练数据的记忆和模仿，难以产生全新的图像</p></blockquote><h2 id="扩散模型"><a class="markdownIt-Anchor" href="#扩散模型"></a> 扩散模型</h2><h3 id="概念"><a class="markdownIt-Anchor" href="#概念"></a> 概念</h3><p>通过不断的 denoise 将噪音去除，index 倒序。<strong>雕塑</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132100562.png" alt="" /></p><h4 id="denoise"><a class="markdownIt-Anchor" href="#denoise"></a> Denoise</h4><p>反复使用同一个 denoise，还要输入 noise 的严重程度，即 index。</p><p>根据图片和 index 产生一个全是噪音的向量，然后两者相减：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132105562.png" alt="" /></p><h5 id="训练-noise-predicter"><a class="markdownIt-Anchor" href="#训练-noise-predicter"></a> 训练 Noise Predicter</h5><p>Q:真实噪音的 ground truth 如何产生？</p><p>A:前向&amp;扩散过程，每次加入噪声。再逆向推理这样的输出和 step x 应该是怎样的输入（噪声）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132109764.png" alt="" /></p><h5 id="考虑文字-text-to-image"><a class="markdownIt-Anchor" href="#考虑文字-text-to-image"></a> 考虑文字 text-to-image</h5><p>将文字额外输入 Denoise 中的 Noise-Predicter</p><p>训练怎么改？——额外添加文字输入</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132113138.png" alt="" /></p><h4 id="数学原理"><a class="markdownIt-Anchor" href="#数学原理"></a> 数学原理</h4><h5 id="训练过程"><a class="markdownIt-Anchor" href="#训练过程"></a> 训练过程</h5><p>实际的训练过程是根据<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.0037em;">α</span></span></span></span>的大小直接决定混入的噪音大小，<strong>一次性</strong>混入噪音！！！t 是加噪的 index</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msqrt><mover accent="true"><msub><mi>a</mi><mi>t</mi></msub><mo stretchy="true">‾</mo></mover></msqrt><msub><mi>x</mi><mn>0</mn></msub><mo>+</mo><msqrt><mrow><mn>1</mn><mo>−</mo><mover accent="true"><msub><mi>a</mi><mi>t</mi></msub><mo stretchy="true">‾</mo></mover></mrow></msqrt><msub><mi>ϵ</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sqrt{\overline{a_t}}x_0+\sqrt{1-\overline{a_t}}\epsilon_{\theta}(x_t,t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.16584500000000002em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.874155em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.63056em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.55056em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-2.834155em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.16584500000000002em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.1310950000000002em;vertical-align:-0.25em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8810950000000001em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.63056em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.55056em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-2.841095em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15890499999999996em;"><span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">ϵ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">θ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132204966.png" alt="" /></p><h5 id="产生图"><a class="markdownIt-Anchor" href="#产生图"></a> 产生图</h5><p>减去噪声后，还要再生成一次噪声加入到图片中。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132209443.png" alt="" /></p><h5 id="极大似然估计法"><a class="markdownIt-Anchor" href="#极大似然估计法"></a> 极大似然估计法</h5><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132214172.png" alt="" /></p><h3 id="稳定扩散模型"><a class="markdownIt-Anchor" href="#稳定扩散模型"></a> 稳定扩散模型</h3><p>框架：文本编码器 encoder——生成式模型生成中间压缩产物——解码器生成大图</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132118638.png" alt="" style="zoom:67%;" /><p><strong>三个 model 单独训练</strong></p><h4 id="文本解码器"><a class="markdownIt-Anchor" href="#文本解码器"></a> 文本解码器</h4><p>diffusion model（扩散模型）的大小对模型好坏反而影响不大，主要是编码器中的所使用的模型。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132132657.png" alt="" /></p><h5 id="图像生成模型评价指标"><a class="markdownIt-Anchor" href="#图像生成模型评价指标"></a> 图像生成模型评价指标</h5><h6 id="fid"><a class="markdownIt-Anchor" href="#fid"></a> FID</h6><p>将图片丢进 CNN 然后将输入和输出的图像比对，计算点之间的距离，越小越好。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132131372.png" alt="" /></p><h6 id="clip"><a class="markdownIt-Anchor" href="#clip"></a> CLIP</h6><p>不同编码器得出的向量越相似，CLIP 值越高</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132150353.png" alt="" /></p><h4 id="生成式模型"><a class="markdownIt-Anchor" href="#生成式模型"></a> 生成式模型</h4><p>denoise</p><h5 id="训练过程-2"><a class="markdownIt-Anchor" href="#训练过程-2"></a> 训练过程</h5><p>如果是隐变量，noise 不再像扩散模型一样加在图片上，而是加在中间产物上</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132156625.png" alt="" /></p><h5 id="运用模型"><a class="markdownIt-Anchor" href="#运用模型"></a> 运用模型</h5><p>不断去噪声</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132157897.png" alt="" /></p><h4 id="解码器"><a class="markdownIt-Anchor" href="#解码器"></a> 解码器</h4><p>不需要影像文字成对的资料。</p><h5 id="中间产物小图"><a class="markdownIt-Anchor" href="#中间产物小图"></a> 中间产物：小图</h5><p>成对的小图大图做训练</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132153344.png" alt="" /></p><h5 id="中间产物隐变量"><a class="markdownIt-Anchor" href="#中间产物隐变量"></a> 中间产物：隐变量</h5><p>自编码器</p><h2 id="生成对抗网络"><a class="markdownIt-Anchor" href="#生成对抗网络"></a> 生成对抗网络</h2><p>输入固定的 x，但是会随机生成 z，生成的结果不同的 y。——让机器有创造力，产生不同的回答！</p><p><strong>生成器与判别器</strong></p><p>不断地“对抗”，生成器越来越精细，判别器越来越严格</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132247697.png" alt="" /></p><h3 id="算法"><a class="markdownIt-Anchor" href="#算法"></a> 算法</h3><ul><li><p>初始化生成器和判别器</p></li><li><p>固定生成器的值，更新判别器（学习目标是让真实图像输出高分，生成图像输出低分；实质就是分为两类）</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406132250201.png" alt="" /></p></li><li><p>固定判别器，更新生成器（判别器生成的数值越大越好）</p></li><li><p>迭代训练</p></li></ul><h3 id="理论分析"><a class="markdownIt-Anchor" href="#理论分析"></a> 理论分析</h3><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mi>G</mi></msub></mrow><annotation encoding="application/x-tex">P_G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">G</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为生成器生成出来的集合，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi></mrow></msub></mrow><annotation encoding="application/x-tex">P_{data}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">d</span><span class="mord mathdefault mtight">a</span><span class="mord mathdefault mtight">t</span><span class="mord mathdefault mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为真实的集合，将他们的之间的距离定义为 Loss 函数。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406140005576.png" alt="" /></p><blockquote><p>无需知道内容，直接进行<mark>采样</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406140008029.png" alt="" /></p></blockquote><p><strong>判别器：尽可能区分训练出来的和真实的</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406140008504.png" alt="" /></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>D</mi><mo>∗</mo></msup><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>i</mi><msub><mi>n</mi><mi>G</mi></msub><mi>m</mi><mi>a</mi><msub><mi>x</mi><mi>D</mi></msub><mi>V</mi><mo stretchy="false">(</mo><mi>G</mi><mo separator="true">,</mo><mi>D</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">D^*=argmin_{G}max_{D}V(G,D)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">G</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">G</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mclose">)</span></span></span></span></span></p><h1 id="强化学习"><a class="markdownIt-Anchor" href="#强化学习"></a> 强化学习</h1><p>即告诉机器结果是好是坏。</p><p>chatgpt：自监督学习+强化学习</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406141005298.png" alt="" /></p><ul><li>智能体 agent</li><li>环境 environment</li><li>状态 state：不是机器人当前的状态，而是环境所给的状态，即智能体所看到的（eg：看到了一杯水）</li><li>动作 action：智能体影响环境</li><li>奖励 reward：环境根据机器人所做的 action 给出评价</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406141013418.png" alt="" style="zoom:67%;" /><p>智能体为了不断改进 action 以 maximize 奖励。</p><blockquote><p>AlphaGo：环境——对手，状态——当前局面，动作——下一步落子位置，奖励——赢|输|什么都没发生</p></blockquote><p>supervised：对应局面获得应该下在哪里</p><p>reinforcement：在 experiment 学习</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406141021017.png" alt="" /></p><p>两个 agent 对话，然后用判别器判别和真人说的像不像</p><p>难点：</p><ul><li>reward delay：开火之前的移动也很重要，但没有任何 reward</li><li>智能体的动作同样影响看到的情景</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406141416518.png" alt="" /></p><blockquote><p>课上讲无模型强化学习</p></blockquote><h2 id="基于策略的强化学习"><a class="markdownIt-Anchor" href="#基于策略的强化学习"></a> 基于策略的强化学习</h2><p>要训练的是通过 state 应该有什么样的 action。</p><h2 id="基于价值的强化学习"><a class="markdownIt-Anchor" href="#基于价值的强化学习"></a> 基于价值的强化学习</h2><p><mark>价值函数</mark>：表示智能体在时刻 t 处于状态 s 时，按照策略 π 采取行动时所获得回报的期望。衡量了某个状态的好坏程度，反映了智能体从当前状态出发后还能获得多少好处。</p><p>贝尔曼方程：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>γ</mi><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><mi>R</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V_{\pi}(s_t)=\gamma V_{\pi}(s_{t+1})+R(s_t,a,s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>γ</mi></mrow><annotation encoding="application/x-tex">\gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span></span></span></span> 折扣因子，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V_{\pi}(s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 下一状态的价值，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R(s_t,a,s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 到达下一状态的奖励值，其中 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span> 为策略。</p><p>利用贝尔曼方程联立求解：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406172144425.png" alt="" /></p><p><mark>动作—价值函数</mark>：只能题在时刻 t 处于状态 s 时，选择了动作 a 后，在 t 时刻后根据策略 π 采取行动所获得回报的期望。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>←</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>a</mi><mo stretchy="false">[</mo><mi>R</mi><mo>+</mo><mi>γ</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>−</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)\leftarrow q_\pi(s,a)+a[R+\gamma max_{a&#x27;}q_\pi(s&#x27;,a&#x27;)-q_\pi(s,a)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32797999999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></span></p><p>只给了价值函数：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><munder><mo>∑</mo><mrow><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo>∈</mo><mi>S</mi></mrow></munder><mi>P</mi><mi>r</mi><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mi mathvariant="normal">∣</mi><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>R</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>+</mo><mi>γ</mi><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)=\sum_{s&#x27;\in S}Pr(s&#x27;|s,a)[R(s,a,s&#x27;)+\gamma V_\pi(s&#x27;)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.3717110000000003em;vertical-align:-1.321706em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8556639999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mrel mtight">∈</span><span class="mord mathdefault mtight" style="margin-right:0.05764em;">S</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.321706em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></span></p><p><mark>策略优化定理</mark>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>π</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><mi>a</mi></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi mathvariant="normal">对</mi><mi mathvariant="normal">于</mi><mi mathvariant="normal">任</mi><mi mathvariant="normal">意</mi><mi>s</mi><mo>∈</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pi&#x27;(s)=argmax_aq_\pi(s,a)(对于任意s\in S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord cjk_fallback">对</span><span class="mord cjk_fallback">于</span><span class="mord cjk_fallback">任</span><span class="mord cjk_fallback">意</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span></span></p><h3 id="q-learning"><a class="markdownIt-Anchor" href="#q-learning"></a> Q-learning</h3><p>用一张表存储在各个状态下执行各种动作能够带来的价值<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span>。</p><p>训练过程：</p><ul><li><p>初始化 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub></mrow><annotation encoding="application/x-tex">q_\pi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 函数</p></li><li><p>循环</p><ul><li>初始化 s 为初始状态</li><li>循环<ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><mi>a</mi></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">a=argmax_aq_\pi(s,a&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li><li>执行动作 a，观察奖励 R 和下一个状态 s’</li><li>更新 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>←</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>a</mi><mo stretchy="false">[</mo><mi>R</mi><mo>+</mo><mi>γ</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>−</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)\leftarrow q_\pi(s,a)+a[R+\gamma max_{a&#x27;}q_\pi(s&#x27;,a&#x27;)-q_\pi(s,a)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32797999999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo>←</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">s\leftarrow s&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></li></ul></li><li>直到 s 是终止状态</li></ul></li><li><p>直到 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">q_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 收敛</p></li></ul><h1 id="final"><a class="markdownIt-Anchor" href="#final"></a> Final</h1><p>选择、填空、简答、计算</p><h2 id="大题"><a class="markdownIt-Anchor" href="#大题"></a> 大题</h2><h3 id="svm-支持向量机-2"><a class="markdownIt-Anchor" href="#svm-支持向量机-2"></a> SVM 支持向量机</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406162032249.png" alt="" /></p><p>思想：寻找最大分类间隔的超平面。</p><p>支持向量：离超平面最近的正负样本，只有支持向量才会对分类边界产生作用。</p><h3 id="决策树-2"><a class="markdownIt-Anchor" href="#决策树-2"></a> 决策树</h3><h4 id="步骤"><a class="markdownIt-Anchor" href="#步骤"></a> 步骤</h4><p><strong><mark>以信息增益（选大）|信息增益率（选大）|基尼指数为评判标准（选小）</mark></strong></p><ol><li><p>求因变量的经验信息熵（衡量样本集合“纯度”的指标）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(Y)=-\sum^K_{k=1}P(Y=y_k)log_2P(Y=y_k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.1304490000000005em;vertical-align:-1.302113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p></li><li><p>求各个随机变量的条件熵（每个随机变量有多少种值就有几项）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>v</mi><mo>=</mo><mn>1</mn></mrow><mi>V</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mi mathvariant="normal">∣</mi><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mo>=</mo><msub><mi>y</mi><mi>k</mi></msub><mi mathvariant="normal">∣</mi><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(Y|a)=-\sum^{V}_{v=1}P(a=a^v)\sum^{K}_{k=1}P(Y=y_k|a=a^v)log_2P(Y=y_k|a=a^v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0954490000000003em;vertical-align:-1.267113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.882887em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.22222em;">V</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.267113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.1304490000000005em;vertical-align:-1.302113em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p></li><li><p>求信息增益，哪个大选择哪个划分：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">IG(D,a)=H(Y)-H(Y|a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault">G</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span></span></p></li><li><p>求各个随机变量的固有值（类似于求因变量的信息熵）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>v</mi><mo>=</mo><mn>1</mn></mrow><mi>V</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">IV(a)=-\sum^{V}_{v=1}P(a=a^v)log_2P(a=a^v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0954490000000003em;vertical-align:-1.267113em;"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.882887em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.22222em;">V</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.267113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p>进而求信息增益率：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mi>a</mi><mi>i</mi><msub><mi>n</mi><mi>r</mi></msub><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>a</mi><mo stretchy="false">)</mo></mrow><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><mrow><mi>I</mi><mi>V</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">Gain_ratio(D,a)=\frac{H(Y)-H(Y|a)}{IV(a)}=\frac{IG(a)}{IV(a)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">G</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">o</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord">∣</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault">G</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li><li><p>基尼值（有几种类型减几次，<mark>随机抽取两个样本，其类别标记不一致的概率。如果每个都不一样，则为 0</mark>）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mi>i</mi><mi>n</mi><mi>i</mi><mo stretchy="false">(</mo><mi>D</mi><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><munder><mo>∑</mo><mrow><msup><mi>k</mi><mo mathvariant="normal">′</mo></msup><mi mathvariant="normal">≠</mi><mi>k</mi></mrow></munder><msub><mi>p</mi><mi>k</mi></msub><msub><mi>p</mi><msup><mi>k</mi><mo mathvariant="normal">′</mo></msup></msub><mo>=</mo><mn>1</mn><mo>−</mo><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><msubsup><mi>p</mi><mi>k</mi><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">Gini(D)=\sum^K_{k=1}\sum_{k&#x27;\neq k}p_kp_{k&#x27;}=1-\sum^K_{k=1}p_k^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">G</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.266557em;vertical-align:-1.438221em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mrel mtight"><span class="mrel mtight"><span class="mord mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span class="rlap mtight"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel mtight"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel mtight">=</span></span><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.438221em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:3.1304490000000005em;vertical-align:-1.302113em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.07153em;">K</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-2.4530000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>属性 a 的基尼系数（在 a=某种属性下因变量所占的比例和其他（即使可以分成三类，另外两类也看做同一类处理）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>G</mi><mi>i</mi><mi>n</mi><mi>i</mi><mi mathvariant="normal">_</mi><mi>i</mi><mi>n</mi><mi>d</mi><mi>e</mi><mi>x</mi><mo stretchy="false">(</mo><mi>D</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>v</mi><mo>=</mo><mn>1</mn></mrow><mi>V</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo><mi>G</mi><mi>i</mi><mi>n</mi><mi>i</mi><mo stretchy="false">(</mo><mi>a</mi><mo>=</mo><msup><mi>a</mi><mi>v</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Gini\_index(D,a)=\sum^V_{v=1}P(a=a^v)Gini(a=a^v)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mord mathdefault">G</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">d</span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0954490000000003em;vertical-align:-1.267113em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.882887em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.267113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault">G</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span><span class="mopen">(</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">v</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406162153105.png" alt="" /></p></li><li><p>选基尼指数小的作为分类标准。</p></li></ol><p>继续循环，注意第一次分类，分成两类后，每类的数据集大小改变，<strong><mark>在第一次分类等于是或等于否的条件下！！！</mark></strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406162233741.png" alt="" /></p><h4 id="剪枝"><a class="markdownIt-Anchor" href="#剪枝"></a> 剪枝</h4><ul><li>预剪枝：提前终止某些分支的声场</li><li>后剪枝：生成一颗完全数，再回头剪枝</li></ul><p>减掉以后准确率提升</p><h3 id="ada-boost"><a class="markdownIt-Anchor" href="#ada-boost"></a> Ada Boost</h3><ol><li><p>初始化训练样本的权值分布，每个样本具有相同权重，为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mi>N</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p></li><li><p>优先选择最小错误率的弱分类器</p><p><strong>错误率</strong>(如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><msub><mi>y</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">G_m(x_i)\neq y_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mo stretchy="false">(</mo><mi mathvariant="normal">.</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">I(.)=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mopen">(</span><span class="mord">.</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>)：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>w</mi><mrow><mi>m</mi><mi>i</mi></mrow></msub><mi>I</mi><mo stretchy="false">(</mo><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi mathvariant="normal">≠</mi><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">err_m=\sum^{N}_{i=1}w_{mi}I(G_m(x_i)\neq y_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><mark>也就是所有错的样本权重加和</mark></p><p><strong>弱分类器权重</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>m</mi></msub><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mi>ln</mi><mo>⁡</mo><mfrac><mrow><mn>1</mn><mo>−</mo><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub></mrow><mrow><mi>e</mi><mi>r</mi><msub><mi>r</mi><mi>m</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">a_m=\frac{1}{2}\ln{\frac{1-err_m}{err_m}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.1574400000000002em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop">ln</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p><p><strong>更新训练样本数据分布权重</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>W</mi><mrow><mi>m</mi><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi>i</mi></mrow></msub><mo>=</mo><mfrac><msub><mi>w</mi><mrow><mi>m</mi><mo separator="true">,</mo><mi>i</mi></mrow></msub><msub><mi>z</mi><mi>m</mi></msub></mfrac><msup><mi>e</mi><mrow><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><msub><mi>y</mi><mi>i</mi></msub><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">W_{m+1,i}=\frac{w_{m,i}}{z_m}e^{-a_my_iG_m(x_i)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.94356em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1075599999999999em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.04398em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p>其中，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>Z</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">Z_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 是归一化因子</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>Z</mi><mi>m</mi></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>w</mi><mrow><mi>m</mi><mo separator="true">,</mo><mi>i</mi></mrow></msub><msup><mi>e</mi><mrow><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><msub><mi>y</mi><mi>i</mi></msub><msub><mi>G</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">Z_m=\sum^N_{i=1}w_{m,i}e^{-a_my_iG_m(x_i)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathdefault mtight">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.16454285714285719em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mopen mtight">(</span><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p><mark>实质就是分对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>Z</mi><mi>m</mi></msub><mo>=</mo><mi>e</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mo>−</mo><msub><mi>a</mi><mi>m</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Z_m=exp(-a_m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，分错为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mi>m</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">exp(a_m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">e</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，然后将每一个权重乘对应分没分对加和得到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>Z</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">Z_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，最后再求<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>W</mi><mrow><mi>m</mi><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi>i</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{m+1,i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span></mark></p></li><li><p>组合得到强分类器：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>1</mn></mrow></msub><mi>A</mi><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>2</mn></mrow></msub><mi>B</mi><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mn>3</mn></mrow></msub><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(x)=sign(a_{m1}A+a_{m2}B+a_{m3}C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.08125em;">H</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">s</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">n</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</span></span></span></span></span></p></li></ol><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406170007955.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406170008757.png" alt="" /></p><h3 id="强化学习-2"><a class="markdownIt-Anchor" href="#强化学习-2"></a> 强化学习</h3><p><mark>价值函数</mark>：表示智能体在时刻 t 处于状态 s 时，按照策略 π 采取行动时所获得回报的期望。衡量了某个状态的好坏程度，反映了智能体从当前状态出发后还能获得多少好处。</p><p>贝尔曼方程：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>γ</mi><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><mi>R</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V_{\pi}(s_t)=\gamma V_{\pi}(s_{t+1})+R(s_t,a,s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>γ</mi></mrow><annotation encoding="application/x-tex">\gamma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span></span></span></span> 折扣因子，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V_{\pi}(s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 下一状态的价值，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi><mo stretchy="false">(</mo><msub><mi>s</mi><mi>t</mi></msub><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msub><mi>s</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R(s_t,a,s_{t+1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">t</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 到达下一状态的奖励值，其中 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span> 为策略。</p><p><mark>动作—价值函数</mark>：只能题在时刻 t 处于状态 s 时，选择了动作 a 后，在 t 时刻后根据策略 π 采取行动所获得回报的期望。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>a</mi><msub><mi>x</mi><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">max_{a&#x27;}q_\pi(s&#x27;,a&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32797999999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 为移动到的位置的价值的最大值。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>←</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>a</mi><mo stretchy="false">[</mo><mi>R</mi><mo>+</mo><mi>γ</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>−</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)\leftarrow q_\pi(s,a)+a[R+\gamma max_{a&#x27;}q_\pi(s&#x27;,a&#x27;)-q_\pi(s,a)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32797999999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></span></p><p>只给了价值函数：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><munder><mo>∑</mo><mrow><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo>∈</mo><mi>S</mi></mrow></munder><mi>P</mi><mi>r</mi><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mi mathvariant="normal">∣</mi><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">[</mo><mi>R</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>+</mo><mi>γ</mi><msub><mi>V</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)=\sum_{s&#x27;\in S}Pr(s&#x27;|s,a)[R(s,a,s&#x27;)+\gamma V_\pi(s&#x27;)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.3717110000000003em;vertical-align:-1.321706em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.050005em;"><span style="top:-1.8556639999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mrel mtight">∈</span><span class="mord mathdefault mtight" style="margin-right:0.05764em;">S</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.321706em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></span></p><p><mark>策略优化定理</mark>：优化后选择回报更大的策略。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>π</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><mi>a</mi></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi mathvariant="normal">对</mi><mi mathvariant="normal">于</mi><mi mathvariant="normal">任</mi><mi mathvariant="normal">意</mi><mi>s</mi><mo>∈</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\pi&#x27;(s)=argmax_aq_\pi(s,a)(对于任意s\in S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.051892em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">π</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.801892em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord cjk_fallback">对</span><span class="mord cjk_fallback">于</span><span class="mord cjk_fallback">任</span><span class="mord cjk_fallback">意</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span></span></p><h3 id="q-learning-2"><a class="markdownIt-Anchor" href="#q-learning-2"></a> Q-learning</h3><p>用一张表存储在各个状态下执行各种动作能够带来的价值<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span></span></span></span>。</p><p>训练过程：</p><ul><li>初始化 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub></mrow><annotation encoding="application/x-tex">q_\pi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 函数</li><li>循环<ul><li>初始化 s 为初始状态</li><li>循环<ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><mi>a</mi></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">a=argmax_aq_\pi(s,a&#x27;)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li><li>执行动作 a，观察奖励 R 和下一个状态 s’</li><li>更新 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>←</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>a</mi><mo stretchy="false">[</mo><mi>R</mi><mo>+</mo><mi>γ</mi><mi>m</mi><mi>a</mi><msub><mi>x</mi><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup></msub><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup><mo separator="true">,</mo><msup><mi>a</mi><mo mathvariant="normal">′</mo></msup><mo stretchy="false">)</mo><mo>−</mo><msub><mi>q</mi><mi>π</mi></msub><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">q_\pi(s,a)\leftarrow q_\pi(s,a)+a[R+\gamma max_{a&#x27;}q_\pi(s&#x27;,a&#x27;)-q_\pi(s,a)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.001892em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05556em;">γ</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32797999999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6828285714285715em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">a</span><span class="mclose">)</span><span class="mclose">]</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo>←</mo><msup><mi>s</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">s\leftarrow s&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.751892em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.751892em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></li></ul></li><li>直到 s 是终止状态</li></ul></li><li>直到 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>q</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">q_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 收敛</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191957260.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191957732.png" alt="" /></p><h2 id="简答"><a class="markdownIt-Anchor" href="#简答"></a> 简答</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192011006.png" alt="" /></p><p>（1）该标准化项与参数 w 无关，所以对 w 求导永远为 0，对 w 的优化求解没有作用。</p><p>（2）L2 标准化通过惩罚过大的参数 w 来避免过拟合，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>λ</mi></mrow><annotation encoding="application/x-tex">\lambda</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">λ</span></span></span></span> 小于 0 意味着该损失函数倾向于更大的 w，从而激励过拟合，失去了标准化的作用。</p><blockquote><p>深度学习与机器学习的区别？</p></blockquote><ul><li>数据：深度学习适合处理大数据，机器学习算法更适用于小数据</li><li>硬件：深度学习需要大量计算资源，比如 GPU，机器学习对计算资源的需求相对较低</li><li>特征构建：深度学习从数据中学习特征，机器学习很多特征都需要手工构造</li><li>解决问题方式：深度学习通常利用“端到端”的方式构建模型，机器学习通常将问题分为几个步骤，每个步骤逐一解决，然后将结果组合。</li></ul><blockquote><p>在前馈神经网络中，所有的参数能否被初始化为 0？如果不能，能否全部初始化为其他相同的值？原因是什么？</p></blockquote><p>不能，也不能同时初始化为其他相同的值。如果被初始化相同的值后，在误差反向传播过程中，同一层的神经元所接受到的误差都相同，更新后这些参数的值仍然相同。不管经过多少轮迭代，同一层的神经元参数保持相同，因此无法学习到不同特征的重要程度，失去了学习特征的能力。</p><h3 id="vae-推导"><a class="markdownIt-Anchor" href="#vae-推导"></a> VAE 推导</h3><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406192257225.png" alt="" /></p><blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406202139207.png" alt="" /></p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406202139554.png" alt="" /></p><blockquote><p>说明在 K—均值聚类算法执行过程中，其目标函数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>k</mi></msubsup><msub><mo>∑</mo><mrow><mi>x</mi><mo>∈</mo><msub><mi>G</mi><mi>i</mi></msub></mrow></msub><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo>−</mo><msub><mi>c</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msup><mi mathvariant="normal">∣</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">\sum^k_{i=1}\sum_{x\in G_i}||x-c_i||^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3888179999999999em;vertical-align:-0.39981em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9890079999999999em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29971000000000003em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.17862099999999992em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mrel mtight">∈</span><span class="mord mtight"><span class="mord mathdefault mtight">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.39981em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">∣</span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord">∣</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span> 是严格递减的，并解释为什么 K—均值聚类算法可以确保在有限步内收敛。</p></blockquote><p>在每一次迭代中，目标函数都在逐步减小，数据点被分配到最近的簇中心后，簇中心会根据簇中的数据点重新计算，以最小化目标函数，使得目标函数的值不断减小。数据点和簇中心的数量是有限的，所以可以在有限步内收敛到最优解。</p><blockquote><p>请回答以下关于自编码器相关问题。</p><p>（1）最小化重构误差的思想可以引申到（深度）自编码器。当采用一层线性编码器和一层线性解码 器的自编码器结构，并用梯度下降法通过最小化重构误差目标函数对编解码器参数进行优化 时，其结果跟佐佃佁得到的结果是否相同？为什么？</p><p>（2）变分自动编码器与传统自动编码器相比具有什么特点？请解释变分自动编码器如何实现潜在空 间的连续性和可解释性。</p></blockquote><p>（1）不同。从目标函数思考。PCA 需要正交约束，自编码器通常不需要。</p><p>（2）自编码器通常用于特征降维和还原，而变分自编码器面向生成任务，隐空间实现了从数值编码到数据分布的变化。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;p&gt;选择、填空、简答、计算&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gitee.com/bxrbxr/images/raw/master/imgs/2024072322031</summary>
      
    
    
    
    <category term="大二下" scheme="http://example.com/categories/%E5%A4%A7%E4%BA%8C%E4%B8%8B/"/>
    
    
    <category term="笔记" scheme="http://example.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="人工智能" scheme="http://example.com/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>经济管理</title>
    <link href="http://example.com/2024/07/24/%E7%BB%8F%E6%B5%8E%E7%AE%A1%E7%90%86/"/>
    <id>http://example.com/2024/07/24/%E7%BB%8F%E6%B5%8E%E7%AE%A1%E7%90%86/</id>
    <published>2024-07-24T15:03:24.000Z</published>
    <updated>2024-07-24T15:38:19.546Z</updated>
    
    <content type="html"><![CDATA[<meta name="referrer" content="no-referrer" /><h1 id="经济问题与经济学"><a class="markdownIt-Anchor" href="#经济问题与经济学"></a> 经济问题与经济学</h1><p>经济问题的产生：需要的无限性与经济资源的稀缺性。</p><p>经济：一定范围（国家、区域）内组织一切<strong>生产、流通、分配、消费</strong>活动与关系的系统。</p><p>经济学：研究经济问题、探讨经济发展规律、解释经济现象成因的社会科学。<mark>强调资源的稀缺性和选择的重要性</mark></p><p>经济资源稀缺性：</p><ul><li>自由资源：无代价。</li><li>经济资源：有代价，不可无限取用。<ul><li>除了<strong>时间、信息</strong>这两种重要的资源外，经济资源基本分为三种，即<strong>人力资源、自然资源、资本资源</strong>。</li><li>这些资源构成生产要素：<strong>土地、资本、劳动力、企业家才能</strong>。</li></ul></li></ul><p>马斯洛层次需求理论：<strong>生理需要、安全需要、情感和归属感需要（社会需要）、尊重需要、自我实现需要</strong>。</p><ul><li>微观经济学-资源的有效配置<ul><li>生产什么和生产多少：产品</li><li>如何生产：手段、时间、地点</li><li>为谁生产：市场</li></ul></li><li>宏观经济学-一个社会既定的生产资源总量是否得到充分利用、如何得以充分利用。<ul><li>经济增长</li><li>物价稳定</li><li>充分就业</li><li>国际收支平衡</li></ul></li></ul><p>微观经济学要以单个经济单位（单个消费者、单个生产者、单个市场经济活动）作为研究对象；宏观经济学以国民经济总过程的活动为研究对象。</p><p><strong>社会经济体制四种类型</strong>：为自给经济（习惯）、 市场经济（市场机制）、计划经济（指令性计划和行政命令）和混合经济（市场和计划相结合）</p><p><strong>理性经济人假设</strong>：人是经济人，即自利的理性者</p><p>经济学发展史：</p><ul><li>启蒙阶段：重商重农</li><li>古典学派：《国富论》标志着古典经济学的诞生——亚当斯密 ，大卫·李嘉图（《政治经济学及赋税原理》），约翰·穆勒《政治经济学原理》 <mark>自由竞争</mark></li><li>新古典主义：奠基者——马歇尔《经济学原理》，凯恩斯</li><li>凯恩斯主义：《通论》解释了引致大萧条的经济机制，开创了现代宏观经济学，宏观经济学支付</li><li>后凯恩斯时代<br /><img src="http://gitee.com/bxrbxr/images/raw/master/imgs/202406130814421.png" alt="" /></li></ul><h1 id="微观市场机制分析"><a class="markdownIt-Anchor" href="#微观市场机制分析"></a> 微观市场机制分析</h1><p><mark>微观经济学（新古典）的核心是价格均衡理论</mark></p><p><font color = "red">需求</font>：消费者在某一特定的时期内和一定的市场上在某种可能得价格水平下**<u>愿意而且能够购买</u><strong>的某种商品或服务的数量。需求是指消费者</strong>有支付能力**的需求，<mark>有别于无限的多样化需要needs</mark></p><p>影响商品需求量的主要因素：核心是<mark>价格</mark>，消费者收入水平I，相关商品的价格Pr（替代品，互补品），消费者的偏好T，消费者对商品的未来价格预期E，其他因素（时间因素（季节性），促销广告）</p><p><strong>价格——需求量曲线</strong>：纵轴为价格，横轴为需求量</p><p>需求定律：商品需求量与价格呈反方向变化。</p><p>解释：</p><ul><li>替代效应：价格上升，消费者更多购买该商品的替代品，，而更少购买价格上升的商品。</li><li>收入效应：短时间内实际收入不变，价格上升，相对收入水平下降，所购正常品的总量下降。</li></ul><p>低档品vs需求定律</p><ul><li>一般低档品：价格上升会导致相对收入下降，低档品的“收入效应”会使得需求上升（低档品需求与收入反方向变化）。</li><li><mark>吉芬品</mark>：总需求随着价格上升而上升。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152002556.png" alt="" /></p><p>一定范围内的个体需求的合成构成市场需求。</p><ul><li>需求：各个价格水平下消费者愿意购买和能够购买的商品或服务的数量</li><li>需求量：确定的价格水平下消费者购买的商品或服务的量</li></ul><p><font color='red'>需求的变动（关系）—曲线变动，需求量的变动（数值）—从曲线上点到点的移动</font></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152003875.png" alt="" /></p><p>需求弹性：衡量商品的需求量变动对影响因素变化的反应程度。</p><p>价格弹性：价格变化百分之一时所引起的商品需求量变化的百分比。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">需</mi><mi mathvariant="normal">求</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">弹</mi><mi mathvariant="normal">性</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">需</mi><mi mathvariant="normal">求</mi><mi mathvariant="normal">量</mi><mi mathvariant="normal">变</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">百</mi><mi mathvariant="normal">分</mi><mi mathvariant="normal">比</mi></mrow><mrow><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">变</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">百</mi><mi mathvariant="normal">分</mi><mi mathvariant="normal">比</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">需求的价格弹性=\frac{需求量变动百分比}{价格变动百分比}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">需</span><span class="mord cjk_fallback">求</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">弹</span><span class="mord cjk_fallback">性</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.363em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">变</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">百</span><span class="mord cjk_fallback">分</span><span class="mord cjk_fallback">比</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">需</span><span class="mord cjk_fallback">求</span><span class="mord cjk_fallback">量</span><span class="mord cjk_fallback">变</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">百</span><span class="mord cjk_fallback">分</span><span class="mord cjk_fallback">比</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>价格弧弹性（横坐标/纵坐标）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>E</mi><mi>p</mi></msub><mo>=</mo><mfrac><mrow><mi mathvariant="normal">△</mi><mi>Q</mi><mi mathvariant="normal">/</mi><mover accent="true"><mi>Q</mi><mo stretchy="true">‾</mo></mover></mrow><mrow><mi mathvariant="normal">△</mi><mi>P</mi><mi mathvariant="normal">/</mi><mover accent="true"><mi>P</mi><mo stretchy="true">‾</mo></mover></mrow></mfrac></mrow><annotation encoding="application/x-tex">E_p=\frac{\triangle Q/\overline{Q}}{\triangle P/\overline P}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.58366em;vertical-align:-1.02333em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.56033em;"><span style="top:-2.22667em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833300000000001em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span></span><span style="top:-3.80333em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault">Q</span><span class="mord">/</span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833300000000001em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">Q</span></span></span><span style="top:-3.80333em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.02333em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>点弹性<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">△</mi><mi>P</mi><mo>−</mo><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\triangle P-&gt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">−</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>。</p><ul><li>富有弹性：绝对值&gt;1。</li><li>缺乏弹性：弹性&lt;1.</li><li>单位弹性：=1。</li><li>完全弹性：无穷大。</li><li>完全无弹性：0。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152004489.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152005244.png" alt="" /></p><ul><li>替代品越多，相近程度越高，该商品的需求的价格弹性就越大。</li><li>生活必需品的需求的价格弹性较小，非必需品的需求弹性较大。</li><li>商品用途越是广泛，需求的价格弹性就可能越大。</li><li>某商品上的消费支出在预算总支出中所占的比重越大，需求的价格弹性可能越大。</li><li>考察/度量的时间越长，需求弹性一般就越大。</li></ul><blockquote><p>个人理解：弹性越大越不稳定（？）</p></blockquote><p>需求价格弹性应用：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">销</mi><mi mathvariant="normal">售</mi><mi mathvariant="normal">总</mi><mi mathvariant="normal">收</mi><mi mathvariant="normal">益</mi><mo>=</mo><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mo>×</mo><mi mathvariant="normal">销</mi><mi mathvariant="normal">售</mi><mi mathvariant="normal">量</mi></mrow><annotation encoding="application/x-tex">销售总收益=价格\times销售量</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">销</span><span class="mord cjk_fallback">售</span><span class="mord cjk_fallback">总</span><span class="mord cjk_fallback">收</span><span class="mord cjk_fallback">益</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">销</span><span class="mord cjk_fallback">售</span><span class="mord cjk_fallback">量</span></span></span></span></span></p><ul><li>富有弹性：销售总收益与商品的价格反方向变动</li><li>缺乏弹性：销售总收益与商品的价格同方向变动</li><li>单位弹性：没有影响</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152005208.png" alt="" /></p><p>需求的收入弹性：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152006727.png" alt="" /></p><p>恩格尔定律：家庭或国家越富裕，食物需求的收入弹性越小。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152006267.png" alt="" /></p><p><strong>交叉价格弹性</strong></p><ul><li>替代品：交叉价格弹性为正</li><li>互补品：交叉价格弹性为负</li><li>相互独立：0</li></ul><p><mark><strong>市场供给分析</strong></mark></p><blockquote><p>供给定律：一般商品的供给曲线向右上方倾斜，即供给量与价格呈同方向变化。（特殊资源：土地——供给固定，劳动力——提高工资减少劳动力供给）</p></blockquote><p>供给量变动：价格引起。点的变化</p><p>供给变动：供给曲线的移动（<strong>可能是平移也可能不是</strong>）</p><p><strong>市场供给弹性</strong>：衡量商品供给量变动对影响因素变化的反应程度。</p><p>（价格弹性，成本弹性，交叉价格弹性）</p><p><strong>供给价格弹性</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>E</mi><mi>s</mi></msub><mo>=</mo><mfrac><mrow><mi mathvariant="normal">△</mi><mi>Q</mi><mi mathvariant="normal">/</mi><mi>Q</mi></mrow><mrow><mi mathvariant="normal">△</mi><mi>P</mi><mi mathvariant="normal">/</mi><mi>P</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">E_s=\frac{\triangle Q/Q}{\triangle P/P}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault">Q</span><span class="mord">/</span><span class="mord mathdefault">Q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>影响因素：</p><ul><li>考察时间长度</li><li>生产成本随产量变化的情况</li><li>商品生产周期</li></ul><p><mark><strong>只对生产者征税 / 补贴，供给减少 / 增加；只对消费者征税 / 补贴，需求减少 / 增加。税收 / 补贴都由斜率大（价格弹性小）的一方更多承担。</strong></mark></p><p>市场均衡与政府政策</p><blockquote><p>价格不是总价！！！！！！！！！！！！征税直接加即可</p></blockquote><p>供给曲线</p><ul><li>局部均衡：单个或部分市场的供给、需求与价格之间的均衡状态。</li><li>一般均衡：所有市场的供给、需求与价格之间的均衡状态。</li></ul><p>**商品的均衡价格：需求和供给相等时的价格，对应均衡数量                   **</p><p>商品过剩：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152008351.png" alt="" style="zoom:67%;" /><p>商品短缺：</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152008899.png" alt="" style="zoom:67%;" /><p>需求增加：需求曲线向右移动，均衡价格和均衡数量都增加</p><p>供给增加：供给曲线向右移动，均衡数量增加，均衡价格降低</p><p><strong>市场均衡</strong></p><p>价格控制</p><p>1.规定价格上限</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152008223.png" alt="" /></p><p>规定最高价格为OI，则供给逐渐降低到OR，需求量增加到OL。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">短</mi><mi mathvariant="normal">缺</mi><mi mathvariant="normal">数</mi><mo>:</mo><mi>O</mi><mi>L</mi><mo>−</mo><mi>O</mi><mi>R</mi><mo>=</mo><mi>R</mi><mi>L</mi></mrow><annotation encoding="application/x-tex">短缺数:OL-OR=RL</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord cjk_fallback">短</span><span class="mord cjk_fallback">缺</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">L</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault">L</span></span></span></span></span></p><p>积极作用：短期突发事件，维持消费者基本生活需要</p><p>消极作用：不反应市场真实供求状况的价格信息，企业缺乏动力，政府财政支出增加，滋生腐败的机会增多</p><p>2.规定价格下限</p><p>规定价格OI，刺激供给量增加到OL，抑制需求量到OR。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">过</mi><mi mathvariant="normal">剩</mi><mi mathvariant="normal">量</mi><mo>=</mo><mi>O</mi><mi>L</mi><mo>−</mo><mi>O</mi><mi>I</mi><mo>=</mo><mi>R</mi><mi>L</mi></mrow><annotation encoding="application/x-tex">过剩量=OL-OI=RL</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">过</span><span class="mord cjk_fallback">剩</span><span class="mord cjk_fallback">量</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">L</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault">L</span></span></span></span></span></p><p>积极作用：保护生产者消费者的利益，促进社会安定</p><p>消极作用：难以操作，政府财政支出增加<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152008471.png" alt="" /></p><h2 id="大题供需关系"><a class="markdownIt-Anchor" href="#大题供需关系"></a> 【大题】供需关系</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191713258.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406201036659.png" alt="" /></p><h2 id="计算需求价格弹性"><a class="markdownIt-Anchor" href="#计算需求价格弹性"></a> 【计算】需求价格弹性</h2><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi mathvariant="normal">△</mi><mi>Q</mi><mi mathvariant="normal">/</mi><mover accent="true"><mi>Q</mi><mo stretchy="true">‾</mo></mover></mrow><mrow><mi mathvariant="normal">△</mi><mi>P</mi><mi mathvariant="normal">/</mi><mover accent="true"><mi>P</mi><mo stretchy="true">‾</mo></mover></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\triangle Q/\overline{Q}}{\triangle P/\overline{P}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.58366em;vertical-align:-1.02333em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.56033em;"><span style="top:-2.22667em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833300000000001em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span></span></span><span style="top:-3.80333em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault">Q</span><span class="mord">/</span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833300000000001em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">Q</span></span></span><span style="top:-3.80333em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.02333em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><h1 id="要素投入与市场结构"><a class="markdownIt-Anchor" href="#要素投入与市场结构"></a> 要素投入与市场结构</h1><p><strong>边际报酬递减</strong></p><p>多种投入要素：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x=(x_1,x_2,...,x_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。平均产量：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>P</mi><mo>=</mo><mi>T</mi><mi>P</mi><mi mathvariant="normal">/</mi><msub><mi>X</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">AP=TP/X_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07847em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p>TP：总产量指投入与产出的总关系</p><p>AP：平均产量</p><p>边际产量：其他要素投入量不变，增加某要素单位<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>投入所引起的总产量变化：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><msub><mi>P</mi><msub><mi>x</mi><mi>i</mi></msub></msub><mo>=</mo><mfrac><mrow><mi mathvariant="normal">△</mi><mi>Q</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">△</mi><msub><mi>x</mi><mi>i</mi></msub></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>α</mi><mi>Q</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><mrow><mi>α</mi><msub><mi>x</mi><mi>i</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex"> MP_{x_i}=\frac{\triangle Q(x)}{\triangle x_i}=\frac{\alpha Q(x)}{\alpha x_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.93343em;vertical-align:-0.2501em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139199999999997em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3280857142857143em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2501em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.30744em;vertical-align:-0.8804400000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault">Q</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.263em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="mord mathdefault">Q</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><blockquote><p><strong>边际报酬递减律</strong>：在技术水平不变的条件下，若连续等量地把某种可变生产要素投入到生产系统中而维持其他生产要素的投入不变，那么当这一要素总投入量超过某个临界值时，增加该要素一个单位的投入，其边际产量会逐渐减少。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152010996.png" alt="" style="zoom:50%;" /></blockquote><p><mark>边际产量和平均产量的交点，是平均产量的最大点</mark></p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152011724.png" alt="" style="zoom:50%;" /><p><strong>规模报酬</strong>：因为要素的投入规模变化导致的产量的变动</p><ul><li>规模报酬不变：投入要素增加的比例和产出增加的比例相等</li><li>递增</li><li>递减</li></ul><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152011302.png" alt="" style="zoom:50%;" /><p>等产量线：产量相等的生产要素组合形成的曲线。</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152011842.png" alt="" style="zoom:67%;" /><p>等产量线上不同生产要素组合产生同样结果——生产要素可相互替代</p><ul><li><p><strong>等产量线是直线</strong>：要素间替代率是定值，单位某要素能被恒定数量另一要素替代</p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152011553.png" alt="" style="zoom:67%;" /></li><li><p><strong>等产量线曲线</strong>：替代率不恒定</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152011161.png" alt="" /></p></li><li><p><strong>等产量线直角折线</strong>：完全不能替代</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152012886.png" alt="" /></p></li></ul><p>替代率：要素x减少单位数量所应增加的y的投入量。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mi>R</mi><mi>S</mi><mo>=</mo><mi mathvariant="normal">∣</mi><mfrac><mrow><mi mathvariant="normal">△</mi><mi>y</mi></mrow><mrow><mi mathvariant="normal">△</mi><mi>x</mi></mrow></mfrac><mi mathvariant="normal">∣</mi><mo>=</mo><mi mathvariant="normal">∣</mi><mfrac><mrow><mi>d</mi><mi>y</mi></mrow><mrow><mi>d</mi><mi>x</mi></mrow></mfrac><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">MRS=|\frac{\triangle y}{\triangle x}|=|\frac{dy}{dx}|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.25188em;vertical-align:-0.8804400000000001em;"></span><span class="mord">∣</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∣</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.0574399999999997em;vertical-align:-0.686em;"></span><span class="mord">∣</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="mord mathdefault">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∣</span></span></span></span></span></p><p>等产量线上，要素 x 变化 dx，与要素 y 变化 dy，各自引起的边际产量MP变化相互抵消：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>d</mi><mi>y</mi></mrow><mrow><mi>d</mi><mi>x</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>M</mi><msub><mi>P</mi><mi>x</mi></msub></mrow><mrow><mi>M</mi><msub><mi>P</mi><mi>y</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{dy}{dx}=\frac{MP_x}{MP_y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574399999999997em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="mord mathdefault">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.332438em;vertical-align:-0.972108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.972108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><strong>投入要素最佳组合</strong></p><p>等成本线：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mo>=</mo><msub><mi>P</mi><mi>x</mi></msub><mi>x</mi><mo>+</mo><msub><mi>P</mi><mi>y</mi></msub><mi>y</mi></mrow><annotation encoding="application/x-tex">C=P_xx+P_yy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></span></p><p>C预算，要素x，y，购进价格P。</p><p>投入要素最佳组合</p><p>产量最大决策：</p><p>目标：maxQ(x，y）s.t.<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mo>=</mo><msub><mi>P</mi><mi>x</mi></msub><mi>x</mi><mo>+</mo><msub><mi>P</mi><mi>y</mi></msub><mi>y</mi></mrow><annotation encoding="application/x-tex">C=P_xx+P_yy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>总成本约束固定。</p><p>方法：<strong>找一条等产量线，使之与给定预算的等成本线相切，切点就是生产要素最佳组合点</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>M</mi><msub><mi>P</mi><mi>x</mi></msub></mrow><msub><mi>P</mi><mi>x</mi></msub></mfrac><mo>=</mo><mfrac><mrow><mi>M</mi><msub><mi>P</mi><mi>y</mi></msub></mrow><msub><mi>P</mi><mi>y</mi></msub></mfrac></mrow><annotation encoding="application/x-tex">\frac{MP_x}{P_x}=\frac{MP_y}{P_y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.19633em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.332438em;vertical-align:-0.972108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.972108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>成本最小决策：</p><p>目标：C最小。Q(x，y）固定</p><p>方法：<strong>找到一条等成本线，与给定的等产量线相切</strong></p><p><strong>成本：</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">产</mi><mi mathvariant="normal">品</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi><mo>=</mo><mi mathvariant="normal">物</mi><mi mathvariant="normal">化</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi><mo>+</mo><mi mathvariant="normal">工</mi><mi mathvariant="normal">资</mi><mi mathvariant="normal">（</mi><mi mathvariant="normal">劳</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">值</mi><mi mathvariant="normal">）</mi><mspace linebreak="newline"></mspace><mi mathvariant="normal">产</mi><mi mathvariant="normal">品</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">值</mi><mo>=</mo><mi mathvariant="normal">产</mi><mi mathvariant="normal">品</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi><mo>+</mo><mi mathvariant="normal">利</mi><mi mathvariant="normal">润</mi><mi mathvariant="normal">和</mi><mi mathvariant="normal">税</mi><mi mathvariant="normal">金</mi></mrow><annotation encoding="application/x-tex">产品成本=物化成本+工资（劳动价值）\\产品价值=产品成本+利润和税金</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">品</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">物</span><span class="mord cjk_fallback">化</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">工</span><span class="mord cjk_fallback">资</span><span class="mord cjk_fallback">（</span><span class="mord cjk_fallback">劳</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">值</span><span class="mord cjk_fallback">）</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">品</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">值</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">品</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">利</span><span class="mord cjk_fallback">润</span><span class="mord cjk_fallback">和</span><span class="mord cjk_fallback">税</span><span class="mord cjk_fallback">金</span></span></span></span></span></p><ul><li>固定成本：不随产量变动而变动（厂房建设）</li><li>变动成本：随产量变化而变化（原材料）</li><li>总成本：两者之和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>T</mi><mi>C</mi><mo>=</mo><mi>F</mi><mo>+</mo><mi>v</mi><mi>x</mi></mrow><annotation encoding="application/x-tex">TC=F+vx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mord mathdefault">x</span></span></span></span></li></ul><p>短期&amp;长期</p><ul><li>短期成本：至少有一种投入要素不能变化的时期**（固定+变动）**</li><li>长期成本：所有投入要素量都能改变**（都是变动）<mark>长期成本都是变动成本</mark>**</li></ul><p>机会&amp;会计</p><ul><li>机会成本：一种资源用于某种用途而放弃用于其他用途所丧失的潜在利益</li><li>会计成本：实际的费用或者支出</li></ul><p>平均&amp;边际</p><ul><li>平均成本：总成本与总产量的比值</li><li>边际成本：增加单位产量二引起的成本增加</li></ul><p><mark>边际成本和平均成本的交点，是平均成本的最低点</mark></p><p>产品的价值由三部分组成：<strong>物化成本、工资、利润和税金</strong>。</p><p>产品<font color = "red">成本</font>包括：<strong>物化成本、工资</strong>。</p><p><strong>利润：</strong></p><p><strong>利润最大的必要条件：边际收益 = 边际成本</strong>。</p><p>产量最大不一定对应利润最大。确定是否增加产量：边际收益 &gt; 边际成本，即可增加产量。</p><p><strong>市场结构与生产决策</strong></p><p><font color = "red">市场结构</font>：买主和卖主数量的多少、产品之间相互差异的程度以及新的生产者进入市场的难易程度。</p><ul><li>完全垄断：只有一个巨头，可以通过调整价格实现利润最大化</li><li>完全竞争：价格由市场定，企业无法左右市场</li><li>垄断竞争：较多同类产品提供者，产品具有差异但可以相互替代</li><li>寡头垄断：供应者更少，一个寡头的决策会影响其他寡头，但同时也会被其他影响（博弈结构）</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152020338.png" alt="" /></p><p>市场失灵原因：不完全竞争，产品外部性，非对称信息，公共物品问题</p><h2 id="计算生产要素组合"><a class="markdownIt-Anchor" href="#计算生产要素组合"></a> 【计算】生产要素组合</h2><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>M</mi><msub><mi>P</mi><mi>x</mi></msub></mrow><msub><mi>P</mi><mi>x</mi></msub></mfrac><mo>=</mo><mfrac><mrow><mi>M</mi><msub><mi>P</mi><mi>y</mi></msub></mrow><msub><mi>P</mi><mi>y</mi></msub></mfrac></mrow><annotation encoding="application/x-tex">\frac{MP_x}{P_x}=\frac{MP_y}{P_y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.19633em;vertical-align:-0.8360000000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.332438em;vertical-align:-0.972108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.972108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191518543.png" alt="" /></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mn>20</mn><mo>−</mo><mi>x</mi></mrow><mn>20</mn></mfrac><mo>=</mo><mfrac><mrow><mn>65</mn><mo>−</mo><mi>y</mi></mrow><mn>50</mn></mfrac><mo separator="true">,</mo><mn>20</mn><mi>x</mi><mo>+</mo><mn>50</mn><mi>y</mi><mo>=</mo><mn>2200</mn></mrow><annotation encoding="application/x-tex">\frac{20-x}{20}=\frac{65-y}{50},20x+50y=2200</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">5</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">6</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mord">0</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span></span></span></p><p>x=10,y=40</p><h2 id="计算盈亏平衡点产量"><a class="markdownIt-Anchor" href="#计算盈亏平衡点产量"></a> 【计算】盈亏平衡点产量</h2><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">盈</mi><mi mathvariant="normal">亏</mi><mi mathvariant="normal">平</mi><mi mathvariant="normal">衡</mi><mi mathvariant="normal">点</mi><mi mathvariant="normal">产</mi><mi mathvariant="normal">量</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">固</mi><mi mathvariant="normal">定</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi></mrow><mrow><mi mathvariant="normal">单</mi><mi mathvariant="normal">位</mi><mi mathvariant="normal">销</mi><mi mathvariant="normal">售</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mo>−</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">位</mi><mi mathvariant="normal">变</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">盈亏平衡点产量=\frac{固定成本}{单位销售价格-单位变动成本}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mord cjk_fallback">盈</span><span class="mord cjk_fallback">亏</span><span class="mord cjk_fallback">平</span><span class="mord cjk_fallback">衡</span><span class="mord cjk_fallback">点</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">量</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.4463300000000001em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">销</span><span class="mord cjk_fallback">售</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">变</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">固</span><span class="mord cjk_fallback">定</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><h2 id="计算垄断价格"><a class="markdownIt-Anchor" href="#计算垄断价格"></a> 【计算】垄断价格</h2><p>P为价格函数。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mo>×</mo><mi>Q</mi><mo>−</mo><mi mathvariant="normal">单</mi><mi mathvariant="normal">位</mi><mi mathvariant="normal">变</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi><mo>×</mo><mi>Q</mi><mo>−</mo><mi mathvariant="normal">固</mi><mi mathvariant="normal">定</mi><mi mathvariant="normal">成</mi><mi mathvariant="normal">本</mi></mrow><annotation encoding="application/x-tex">P\times Q-单位变动成本\times Q-固定成本</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">Q</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">单</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">变</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">Q</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">固</span><span class="mord cjk_fallback">定</span><span class="mord cjk_fallback">成</span><span class="mord cjk_fallback">本</span></span></span></span></span></p><p>求导</p><h2 id="计算边际技术替代率"><a class="markdownIt-Anchor" href="#计算边际技术替代率"></a> 【计算】边际技术替代率</h2><p>x对y的边际技术替代率=x的边际产量/y的边际产量</p><p>（每增加一个单位的x，可以替代多少个y）</p><h1 id="宏观经济分析"><a class="markdownIt-Anchor" href="#宏观经济分析"></a> 宏观经济分析</h1><p>凯恩斯：《通论》，率先解释了引致大萧条的经济机制，开创了现代宏观经济学。<mark>管理经济是政府的职责</mark></p><p>研究对象：总产出，通货膨胀，失业，宏观经济政策</p><p><strong>GDP</strong></p><blockquote><p>在一定时期内<strong>生产</strong>的所有<strong>最终</strong>产品和劳务的市场价值，衡量总支出，也衡量总收入</p><p><strong>最终</strong>：不计算中间产品价值</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152029322.png" alt="" /></p><p><strong>生产</strong>：并非单纯出售的产品价值</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152030332.png" alt="" /></p><p>计算流量而非存量：2014年建成的房子出售价值不能计入15</p><p>家务劳动等非市场活动不计入GDP</p></blockquote><ul><li>GNP：某国国民所拥有的全部生产要素在一定时期内所生产的最终产品  <mark>国民</mark></li><li>GDP：一国|地区内的产品的市场价值  <mark>地域</mark></li></ul><p>中国人到美国工作，算美国的GDP，中国的GNP</p><h2 id="大题gdp消费c投资i净出口nx政府购买g"><a class="markdownIt-Anchor" href="#大题gdp消费c投资i净出口nx政府购买g"></a> 【大题】<strong><mark>GDP=消费C+投资I+净出口NX+政府购买G</mark></strong></h2><ul><li>消费：居民个人除购买新住房和建造住宅之外用于最终产品和劳务的支出</li><li>投资：建筑物（购买新住房和建造住宅）、机械设备、存货（企业未销售完的产品形成的“存货投资”）、研发支出等资本存量增加部分的支出<ul><li><mark>不包括金融投资</mark>（股票，基金，债券）</li></ul></li><li>净出口：出口-进口</li><li>政府购买：购买最终产品和劳务的支出（支付公务员的薪酬，建筑道路，开班学校，武器采购）</li></ul><p><strong>经济增长</strong></p><ul><li>名义GDP：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">产</mi><mi mathvariant="normal">量</mi><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">产</mi><mi mathvariant="normal">量</mi><mo>×</mo><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi></mrow><annotation encoding="application/x-tex">当期产量当期价格当期产量\times当期价格</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">量</span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">量</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span></span></span></span></li><li>真实GDP：用以前某一年作为基准期价格计算出来的全部最终产品的市场价值 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">产</mi><mi mathvariant="normal">量</mi><mi mathvariant="normal">基</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">产</mi><mi mathvariant="normal">量</mi><mo>×</mo><mi mathvariant="normal">基</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi></mrow><annotation encoding="application/x-tex">当期产量基期价格当期产量\times基期价格</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">量</span><span class="mord cjk_fallback">基</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">量</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0em;vertical-align:0em;"></span><span class="mord cjk_fallback">基</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span></span></span></span></li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152105070.png" alt="" /></p><p>GDP平减指数：名义GDP与真实GDP之比</p><p>真实GDP增长率</p><blockquote><p>GDP衡量经济增长的局限性：</p><ul><li>不能揭示对自然资源与环境的影响</li><li>不能衡量社会的幸福程度与公正水平</li><li>本身存在遗漏</li></ul><p>⚠️多方考虑资源，增长效率，环境污染，实现经济的绿色可持续增长</p></blockquote><p><strong>失业</strong></p><p>充分就业：全部生产要素（包括劳动）都得到充分利用</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152109818.png" alt="" /></p><p>失业者的三个条件：</p><ul><li>有劳动能力</li><li>愿意就业</li><li>现在没有工作</li></ul><p>失业率：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">失</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">人</mi><mi mathvariant="normal">工</mi><mi mathvariant="normal">数</mi><mi mathvariant="normal">劳</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">力</mi><mi mathvariant="normal">人</mi><mi mathvariant="normal">口</mi><mi mathvariant="normal">数</mi><mfrac><mrow><mi mathvariant="normal">失</mi><mi mathvariant="normal">业</mi><mi mathvariant="normal">人</mi><mi mathvariant="normal">工</mi><mi mathvariant="normal">数</mi></mrow><mrow><mi mathvariant="normal">劳</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">力</mi><mi mathvariant="normal">人</mi><mi mathvariant="normal">口</mi><mi mathvariant="normal">数</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">失业人工数劳动力人口数\frac{失业人工数}{劳动力人口数}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.739em;vertical-align:-0.345em;"></span><span class="mord cjk_fallback">失</span><span class="mord cjk_fallback">业</span><span class="mord cjk_fallback">人</span><span class="mord cjk_fallback">工</span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">劳</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">力</span><span class="mord cjk_fallback">人</span><span class="mord cjk_fallback">口</span><span class="mord cjk_fallback">数</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.394em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord cjk_fallback mtight">劳</span><span class="mord cjk_fallback mtight">动</span><span class="mord cjk_fallback mtight">力</span><span class="mord cjk_fallback mtight">人</span><span class="mord cjk_fallback mtight">口</span><span class="mord cjk_fallback mtight">数</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord cjk_fallback mtight">失</span><span class="mord cjk_fallback mtight">业</span><span class="mord cjk_fallback mtight">人</span><span class="mord cjk_fallback mtight">工</span><span class="mord cjk_fallback mtight">数</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><ul><li><p>自愿失业：自身原因</p></li><li><p>非自愿失业：愿意接受工作但找不到工作，企业需求饱和，劳动者能力有限</p></li><li><p>周期性失业：经济周期中的衰退或萧条阶段，需求下降造成的，是整个经济的支出和产出下降而造成的</p></li><li><p>摩擦性失业：劳资纠纷等造成的短期、局部性失业，起源于劳动力的供给方（不是严重的经济问题）</p></li><li><p>结构性失业：经济结构变化，既有失业也会有职业空缺，长期性，起源于劳动的需求方</p></li><li><p>自然失业：摩擦性失业+结构性失业</p></li><li><p>周期性失业：经济周期变化引起</p></li></ul><p><strong><mark>只有自然失业，没有周期性失业的经济状态=充分就业</mark>，不代表就业率100%</strong></p><p><strong>通货膨胀</strong></p><blockquote><p>产品和劳务价格在一段时间内持续普遍上涨</p></blockquote><p>经济体的价格水平：商品和劳务的价格经过加权平均后的价格</p><p><strong>价格指数</strong>：</p><p>1.消费物价指数CPI</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>P</mi><mi>I</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">一</mi><mi mathvariant="normal">篮</mi><mi mathvariant="normal">子</mi><mi mathvariant="normal">固</mi><mi mathvariant="normal">定</mi><mi mathvariant="normal">商</mi><mi mathvariant="normal">品</mi><mi mathvariant="normal">按</mi><mi mathvariant="normal">当</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">计</mi><mi mathvariant="normal">算</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">值</mi></mrow><mrow><mi mathvariant="normal">一</mi><mi mathvariant="normal">篮</mi><mi mathvariant="normal">子</mi><mi mathvariant="normal">固</mi><mi mathvariant="normal">定</mi><mi mathvariant="normal">商</mi><mi mathvariant="normal">品</mi><mi mathvariant="normal">按</mi><mi mathvariant="normal">基</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">格</mi><mi mathvariant="normal">计</mi><mi mathvariant="normal">算</mi><mi mathvariant="normal">的</mi><mi mathvariant="normal">价</mi><mi mathvariant="normal">值</mi></mrow></mfrac><mo>×</mo><mn>100</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">CPI=\frac{一篮子固定商品按当期价格计算的价值}{一篮子固定商品按基期价格计算的价值}\times100\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.363em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">一</span><span class="mord cjk_fallback">篮</span><span class="mord cjk_fallback">子</span><span class="mord cjk_fallback">固</span><span class="mord cjk_fallback">定</span><span class="mord cjk_fallback">商</span><span class="mord cjk_fallback">品</span><span class="mord cjk_fallback">按</span><span class="mord cjk_fallback">基</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">计</span><span class="mord cjk_fallback">算</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">值</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">一</span><span class="mord cjk_fallback">篮</span><span class="mord cjk_fallback">子</span><span class="mord cjk_fallback">固</span><span class="mord cjk_fallback">定</span><span class="mord cjk_fallback">商</span><span class="mord cjk_fallback">品</span><span class="mord cjk_fallback">按</span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">格</span><span class="mord cjk_fallback">计</span><span class="mord cjk_fallback">算</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">价</span><span class="mord cjk_fallback">值</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">%</span></span></span></span></span></p><p>一篮子=产品种类及比例组合</p><p>2.通货膨胀率：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">第</mi><mi>t</mi><mi mathvariant="normal">年</mi><mi mathvariant="normal">通</mi><mi mathvariant="normal">胀</mi><mi mathvariant="normal">率</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">第</mi><mi>t</mi><mi mathvariant="normal">年</mi><mi>C</mi><mi>P</mi><mi>I</mi><mo>−</mo><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">年</mi><mi>C</mi><mi>P</mi><mi>I</mi></mrow><mrow><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">年</mi><mi>C</mi><mi>P</mi><mi>I</mi></mrow></mfrac><mo>×</mo><mn>100</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">第t年通胀率=\frac{第t年CPI-第t-1年CPI}{第t-1年CPI}\times100\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mord cjk_fallback">年</span><span class="mord cjk_fallback">通</span><span class="mord cjk_fallback">胀</span><span class="mord cjk_fallback">率</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.1296600000000003em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord cjk_fallback">年</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mord cjk_fallback">年</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord cjk_fallback">年</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">%</span></span></span></span></span></p><p>3.批发价格指数WPI</p><p>大宗物资批发价格加权平均得到的价格指数，包括原料、中间产品、最终产品和进出口品，不包括劳务。</p><p><strong>CPI比WPI滞后，可通过WPI预测CPI变化趋势</strong></p><p>4.GDP平减指数：名义GDP与真实GDP的比率</p><p>种类：</p><p>通货紧缩：持续整体物价降低</p><p>按通货膨胀率</p><ul><li>温和的通货膨胀：&lt;10</li><li>奔腾：10~100</li><li>超级：&gt;100</li><li>恶性：月&gt;50</li></ul><p>通货膨胀重点：货币改革之“换币”</p><p>对价格的影响</p><ul><li>平衡：所有商品价格以同比例上升</li><li>非平衡：不同比例上升（绝大多数</li></ul><p>原因</p><ul><li>费雪——货币主义流派：长期的货币量增加引起价格水平同比例上升</li><li>总需求和总供给论：供不应求价格攀升</li><li>结构性通货膨胀轮</li></ul><p><strong>经济周期</strong></p><blockquote><p>指国民总产出、总收入和总就业相对于他们的潜在水平的波动。</p><p>经济的短期波动称为经济周期</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152152862.png" alt="" /></p><p><strong>原因</strong></p><p>1.内生经济周期理论</p><ul><li>原因论货币因素</li><li>投资过度理论：</li><li>心理预期理论</li></ul><p>2.外生经济周期理论</p><p>3.综合论</p><p><mark>现实世界更关心的是：当经济衰退时，如何运用经济政策挽救国家经济</mark></p><p><strong>宏观经济政策</strong></p><p>宏观经济政策目标：充分就业，价格稳定，经济持续均衡增长，国际收支平衡</p><p>宏观经济政策：</p><ul><li>财政政策：国家通过调节政府的支出和收入水平</li><li>货币政策：中央银行通过控制货币市场中的货币供应量</li></ul><h1 id="管理学概述"><a class="markdownIt-Anchor" href="#管理学概述"></a> 管理学概述</h1><p>动态环境下通过对组织内部资源及整合的组织外部资源进行有效<mark>计划、组织、控制、领导</mark>以实现组织目标的科学和艺术过程。</p><blockquote><p>管理的基本职能：计组控领</p></blockquote>管理环境\left\{               \begin{array}{**lr**}               内部环境 \left\{               \begin{array}{**lr**}               资源 &  \\  物理\\心理\\文化             \end{array}  \right.   \\\\             外部环境\left\{               \begin{array}{**lr**}               任务：竞争作用力框架\\一般：PEST分析(Political,Economic,Social,Technological)\\其他             \end{array}  \right.              \end{array}  \right.<p>管理者角色：基层管理者、中级管理者、高层管理者</p>管理者层次\left\{               \begin{array}{**lr**}               基层：管理一线工人，组长\\             中层：项目经理\\            高层：总裁，总经理\\             \end{array}  \right.<p>管理者技能：概念技能，人际技能，技术技能</p>管理者技能\left\{               \begin{array}{**lr**}               概念：抽象\\             人际\\            技术\\             \end{array}  \right.<blockquote><p>概念：层位越高越需要，人际：都需要，技术：层位越低越需要</p></blockquote><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152024568.png" alt="" /></p><p>管理者工作内容：传统管理，沟通，人力资源管理，网络联系</p><p><mark>泰勒</mark>：科学管理之父，《科学管理原理》</p><ul><li>专业化</li><li>计划、执行人员分开</li></ul><p>谋求最高工作效率（科学取代经验对应1，合作实现双赢对应2）</p><p>泰勒的科学管理原则：</p><p>1）工作定额原理：根据动作研究和时间研究确定合适的标准劳动定额；</p><p>2）挑选和培养工人：每个人都有自己合适的工作岗位，管理者有责任针对工人特长分配他们做适合的工作，并且应该对工人进行培训以提高专业技能；</p><p>3）标准化原理：工作环境、操作方法、使用的工具必须统一和标准化；</p><p>4）差别计件工资制：效率越高的工人，给予其单位产出的报酬越高；</p><p>5）计划和执行职能必须分开：管理专业化，计划和执行职能必须分开；</p><p>6）实行职能工长制：工长应成为工人的老师、朋友、建议者，帮助工人进步；</p><p>7）例外原则：经理人员应该着重处理最好和最差的事情，不能羁绊与日常事务。</p><p><mark>法约尔</mark>：法国，过程管理之父，《工业管理与一般管理》</p><p>职能：计划、组织、指挥、协调、控制</p><p><mark>马克斯·韦伯</mark>：德国</p><p>官僚致富：由官职管理，<strong>权利制度化</strong></p><p>权利：</p><ul><li>法定权利（作为行政组织体系的基础，他认可）</li><li>传统权利（世袭）</li><li>超凡权利（个人魅力）</li></ul><p><mark>梅奥</mark>：美国 《人际关系学说》</p><h1 id="企业与管理"><a class="markdownIt-Anchor" href="#企业与管理"></a> 企业与管理</h1><p>企业定义：从事商品生产、流通及服务性活动，满足社会需要并获取利润，实行<mark>自主经营、自负盈亏、自我发展、自我约束</mark>，<strong>独立享受权利和承担义务的法人型或非法人型</strong>的基本经营单位。</p><blockquote><p>是现代社会经济系统基本组织形式</p></blockquote><p>以法律形式分类：独资，合伙，公司制，合作制</p><ul><li>独资（<strong>多</strong>）<ul><li>非法人型：归企业主个人所有，缴纳个人所得税，融资仅限于个人财富，对债务承担无限责任（个人资产==企业资产）</li><li>法人型：国有&amp;外商&amp;一人。仅需以法人资产对企业债务承担有限责任，与私人财产无关。</li></ul></li><li>合伙：两个及以上共同出资，实行联合经营和控制<ul><li>普通：合伙人对企业所有债务负无限连带。必须偿还到底</li><li>有限：普通合伙人和有限合伙人组成。普通：无限连带责任。有限：以其认缴的出资额为限负有限责任</li></ul></li><li>公司制：以营利为目的、独立的法人实体，最重要的现代企业组织形式。<mark>有名称，自然人享有的法律权利，购买和交换资产，签订合同等</mark>。利益方：股东（公司所有者）、董事会、高层管理者。<ul><li>股份有限公司：注册资本由等额股份构成，通过发行股票筹集资本，股东以认购的股份为限对公司承担有限责任 ， 公司以其全部公司资产对公司债务承担责任。股东无上限，<strong>筹资能力强</strong>；可自由转让，<strong>社会化程度高</strong></li><li>有限责任公司：股东不超过50人，独资型企业中的“一人有限责任公司”就是拥有一个自然人或者一个法人股东的有限责任公司</li><li><mark>好处</mark>：潜在分离性，经营者和所有者不一定相同。1.代表公司所有权的股份可以随时转让。2.公司可以无限存续，不因某所有者的死亡或退出而受到影响。3.实行有限责任制度</li></ul></li><li>合作制：不按出资比例分配，通过协商以合同的方式确定（如劳动和股本共同参与红利分配）</li></ul><p>公司三个利益方：<strong>股东、董事会、高层管理者</strong>。</p><p>公司制企业的法人治理结构：股东大会，董事会，监事会，执行层</p><p><strong><mark>现代企业制度基本内容</mark></strong>：以<strong>产权</strong>为基础的企业的组织和管理制度</p><ul><li>企业产权制度：界定和保护参与企业的个人和经济组织的财产权</li><li>企业组织制度：规定了企业的组织形式、内部分 工协调的责任和权利分配关系</li><li>企业管理制度</li></ul><p><strong>现代企业制度要素</strong>：产权制度，法人制度，有限责任制度，管理制度</p><p>发展：独资——合伙企业——公司制</p><p>现代企业制度特点：<mark>产权清晰，权责明确，政企分开，管理科学</mark></p><p>企业四类资源：人，财，物，信息</p><p><font color = "red">企业主要管理活动</font>：<strong>人力资源管理、财务管理、物资与设备管理、企业信息管理、生产与运作管理、质量管理、研发管理、营销管理</strong>。</p><p><strong><mark>营销组合理论</mark>：</strong></p><p>4P理论（市场）：产品（product），价格（price），地点（place），促销（promotion）</p><p>4C理论（顾客）：顾客的需要和欲望（customer needs and wants），成本（cost），便利（convenience），沟通（communication）</p><p>4R理论（企业与顾客在市场变化的动态环境中建立长久互动关系）：关系（relationship）、节省（retrenchment）、关联（relativity）、回报（retribution）</p><blockquote><p>4P理论以<strong>市场 / 产品为导向</strong>，是一种静态组合；4C理论以<strong>顾客为导向</strong>，企业和顾客双向动态沟通，维持良好关系；4R理论强调企业与顾客在市场变化的动态环境中应建立<strong>长久互动的关系</strong>，以防止顾客流失，赢得长期而稳定的市场。</p></blockquote><h1 id="产品开发管理"><a class="markdownIt-Anchor" href="#产品开发管理"></a> 产品开发管理</h1><ol><li><p>产品开发的主要目的是满足顾客的需要，为顾客带来期望的利益和价值。</p></li><li><p>产品开发的评价标准：满足用户需要，良好制造型，产品开发效率</p></li><li><p><font color = "red">产品开发</font>的驱动方式：<strong>市场拉动模式、技术推动模式、竞争驱动模式</strong>。</p></li><li><p>集成化产品开发方法：强调产品开发的不同阶段进行并行与交互。</p></li><li><p>产品战略主要包括**<u>高质量、低成本、差异化和快速反应</u>**。</p></li><li><p>产品开发过程中的跨职能合作可以借助质量功能展开QFD实现。</p><ul><li>QFD基本设计工具—质量屋</li></ul></li><li><p><strong>质量屋</strong>（书199页图）：</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406161622470.png" alt="" /></p><p>获取用户需求（Whats，A区）</p><p>确定每一需求的相对重要性（B区）</p><p>确定技术特性（Hows，图中D区）</p><p>确定关系矩阵：判断每一技术特性与用户特性需要之间是否有因果关系（E区）</p><p>确定技术方案之间的相关性（F区）</p><p>确定产品设计目标（G区）</p></li><li><p>产品设计：</p><ul><li><strong>面向顾客</strong>：<ul><li>产品的<strong>顾客价值</strong>：因使用产品而为顾客带来的利益。</li><li>价值分析和价值工程：价值 = 功能 / 成本</li><li>顾客满意度模型：<strong>基本需求、期望需求、兴奋需求（即使不完善，也能大幅提高）</strong>。</li></ul></li><li><strong>面向制造与装配</strong></li><li><strong>面向环境</strong><ul><li>面向分解</li><li>面向回收</li></ul></li></ul></li></ol><h1 id="生产运作流程管理"><a class="markdownIt-Anchor" href="#生产运作流程管理"></a> 生产运作流程管理</h1><p>流程通常呈分层结构</p><blockquote><p>生产运作流程是运用转换资源（如设备、员工等）把一定的被转换资源（如原材料、零部件等）转化为一定产品和服务的一系列逻辑相关的、结构化活动的集合。</p></blockquote><ol><li><p><strong>系统角度认识</strong>：流程视角，职能视角</p></li><li><p>职能型组织可以实现较高的资源效率；<font color = "red">流程</font>型 / 聚焦型组织可以实现很高的流程效率；复合型组织中既有职能型结构也有流程型结构。</p></li><li><p><strong>生产运作流程分类：</strong></p><ul><li>根据产品/服务的标准化程度及产量的大小分类：单件小批流程，批量流程，大量流程，连续流程</li><li>根据满足需求的方式：<strong>面向库存，面向订单生产，混合型</strong></li><li>流程在企业创造价值中的分类：价值创造流程，支持流程</li></ul></li><li><p>流程图的两种形式：</p><ul><li><p>顺序流程图</p><ul><li>基本流程图：流程模块连接关系</li><li>流程程序图：增加了移动，延迟|等待，储存</li></ul></li><li><p>跨职能流程图：各个参与流程的部分同时呈现，说明流程在不同职能部门之间流转</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406182248898.png" alt="" /></p></li></ul></li><li><p>企业流程经常存在的问题包括流程之间存在：<strong>冗余，浪费，资源冲突，流程串行及反复</strong>。</p></li><li><p>流程分析的方法：<strong>活动价值分析、绩效分析、流程参数分析</strong>。</p></li><li><p>流程评价（根据顾客所认可的价值划分）：</p><ul><li><p>增值活动：给顾客带来直接价值的活动。</p></li><li><p>非增值活动：不能增加产品或服务价值的活动。</p></li><li><p>浪费：原本不该发生却发生了的活动。</p></li></ul></li><li><p><strong>流程周期效率</strong>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>P</mi><mi>C</mi><mi>E</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">增</mi><mi mathvariant="normal">值</mi><mi mathvariant="normal">活</mi><mi mathvariant="normal">动</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi></mrow><mrow><mi mathvariant="normal">总</mi><mi mathvariant="normal">流</mi><mi mathvariant="normal">程</mi><mi mathvariant="normal">时</mi><mi mathvariant="normal">间</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi></mrow><mrow><mi mathvariant="normal">作</mi><mi mathvariant="normal">业</mi><mo>+</mo><mi mathvariant="normal">等</mi><mi mathvariant="normal">待</mi><mo>+</mo><mi mathvariant="normal">移</mi><mi mathvariant="normal">动</mi><mo>+</mo><mi mathvariant="normal">检</mi><mi mathvariant="normal">验</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">PCE=\frac{增值活动时间}{总流程时间}=\frac{作业}{作业+等待+移动+检验}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.363em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">总</span><span class="mord cjk_fallback">流</span><span class="mord cjk_fallback">程</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">增</span><span class="mord cjk_fallback">值</span><span class="mord cjk_fallback">活</span><span class="mord cjk_fallback">动</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">间</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.4463300000000001em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">等</span><span class="mord cjk_fallback">待</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">移</span><span class="mord cjk_fallback">动</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">检</span><span class="mord cjk_fallback">验</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">作</span><span class="mord cjk_fallback">业</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li></ol><h1 id="生产系统结构与战略"><a class="markdownIt-Anchor" href="#生产系统结构与战略"></a> 生产系统结构与战略</h1><ol><li><p><font color = "red">生产</font>线布置：<strong>工艺式布置、对象式布置、固定式布置、单元式布置</strong>。</p><p>1）工艺式布置：搬运距离远，搬运量大；产品停放时间长，生产周期长；计划安排、制品管理、质量控制复杂。适用于每种产品产量比较低的生产系统。</p><p>2）对象式布置：产品批量不大时，难以充分利用生产设备和生产面积。</p><p>3）固定式布置：大型航空航天产品装配、大型轮船制造。</p><p>4）单元式布置介于工艺式布置和对象式布置之间</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406190959979.png" alt="" /></p></li><li><p>制造系统集成：<strong>柔性制造系统、计算机集成制造</strong>。</p></li><li><p>生产管理方式：<strong>按订单生产 / 拉式生产、 备货型生产 / 推式生产、混合型生产流程</strong>。</p><ul><li>客户定制分离点：推/拉过程的过渡点</li></ul></li><li><p>赢得订单的标准：</p><ul><li>订单资格要素：达到标准（在非对抗环境下）可以存活于市场，此时产品水平为顾客满意水平，达到立足市场标准。遇到竞争，不能保证赢得订单</li><li>订单赢得要素：使用户感到快乐。优于其他产品</li></ul></li><li><p>生产系统类型：</p><ul><li><strong>单件小批型</strong>：客户定制化产品，产品差异大，需求难以预测</li><li><strong>批量流水型</strong>：种类相对较少，差异在一定时间内变化不大</li><li><strong>人工节拍流水线</strong>：快餐店，批量比机器节拍更容易调整</li><li><strong>机器节拍流水线（大量流水型）</strong>：自动化 生产量</li><li><strong>连续流程型</strong>：生产标准产品，种类长时间变化不大</li></ul></li><li><p>产品通用竞争战略：成本领先战略，差异化战略，集中化战略</p></li><li><p>生产系统结构-功能关系悖论：没有哪种生产类型能同时在物流连续性（效率） 和应变能力（柔性）两方面都达到最高水平。</p></li></ol><h1 id="库存与生产计划管理"><a class="markdownIt-Anchor" href="#库存与生产计划管理"></a> 库存与生产计划管理</h1><p><strong>需求变化的影响因素：趋势因素（需求总体上越来越多或越来越少），季节性因素，周期性因素和随机因素</strong></p><p>前两个常态变动——有明确的数量规律，后两个剩余变动——比较难于预料</p><p>需求预测方法：主观预测法，客观预测法（时间序列预测，移动平均法（最近n个时期的历史需求的平均值作为下一个时期的需求值，变化平稳的需求），加权移动平均，指数平滑（存在趋势因素），回归分析法，因果预测模型）</p><p><font color = "red">库存</font>：企业所持有的<strong>原材料、零部件、产品</strong>等用于生产或销售的物资。</p><p>库存成本：保存成本，订购成本，缺货惩罚成本</p><blockquote><p>保存成本（持有成本）：</p><p>仓库成本，<strong>库存占用资金的机会成本（资金成本：利息等）</strong>，保险，损耗</p><p><mark>与时间成正比</mark></p><p>订购成本：</p><p>业务洽谈，<strong>运输</strong>，验收</p><p><mark>在一定数量范围内，主要和订购次数有关系，和订购量关系不大</mark></p><p>缺货惩罚成本：</p><p>调货让利，信誉损失，加急订购费</p></blockquote><p><strong>生产计划体系结构</strong>：</p><ul><li><strong>综合生产计划</strong>：围绕一个抽象的综合产品展开，可将相似产品归结为一个在功能结构上具有代表性的虚拟产品。</li><li><strong>主生产计划</strong>：是综合生产计划的进一步细化。细化时间粒度，产品品种</li><li><strong>物料需求计划</strong>（<font color = "red">MRP</font>）：<mark>主生产计划分解为物料需求计划</mark>。从成品主生产计划开始，逆工艺路线，从成品向下逐层分解，直到得到各零部件以及外购原材料的生产和采购计划。<ul><li>物料需求计划中的产品物料清单BOM</li><li><font color='orange'><strong>适合需求不确定因素较低的离散制造装配型生产环境，需求预测准确，计划推动生产</strong></font></li></ul></li><li><strong>车间调度计划</strong>：细化到每件或每批次产品。</li><li><strong>生产计划滚动</strong>：自我修正。</li></ul><p><mark>JIT基于实际订单进行计划分解，而MRP是根据需求预测进行计划分解</mark></p><p><strong>准时制生产</strong>（<font color = "red">JIT</font>主张持续改进和需求到了才开始生产，<mark>零库存</mark>）：就是要求产品线各环节将<strong>必要的产品</strong>（ 原材料、零部件或成品），以<strong>必要的数量</strong>和<strong>完美的质量</strong>，在<strong>正确的时间</strong>送往<strong>正确的地点</strong>。</p><p>JIT定义了七大浪费：<strong>库存积压，过度生产，废品和次品，多余的操作和搬运，故障和有害操作，等待，多余的产品功能</strong>。</p><p>JIT生产的实现方式——看板管理：</p><ul><li>生产看板：在工作地和出口存放处往返运动。</li><li>搬运看板：在上一道工序出口和下一道工序入口往返。</li></ul><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191104522.png" alt="" /></p><p>看板系统的核心原则是：<strong>“看板为王”，无看板，不搬运；无看板，不生产</strong>。</p><h2 id="计算bom"><a class="markdownIt-Anchor" href="#计算bom"></a> 【计算】BOM</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191054829.png" alt="" /></p><ul><li>第一个数字：生产父节点需要几件</li><li>第二个数字：生产该零件需要几天</li></ul><p><mark>后面的数字减，前面的数字乘！！</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191058394.png" alt="" /></p><h2 id="计算移动平均法指数平滑法"><a class="markdownIt-Anchor" href="#计算移动平均法指数平滑法"></a> 【计算】移动平均法，指数平滑法</h2><p>移动平均法：看要求根据最近x期求平均值。</p><p>指数平滑法：</p><blockquote><p>第t期预测值：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">第</mi><mi>t</mi><mi mathvariant="normal">期</mi><mi mathvariant="normal">预</mi><mi mathvariant="normal">测</mi><mi mathvariant="normal">值</mi><mo>=</mo><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">期</mi><mi mathvariant="normal">预</mi><mi mathvariant="normal">测</mi><mi mathvariant="normal">值</mi><mo>+</mo><mi mathvariant="normal">平</mi><mi mathvariant="normal">滑</mi><mi mathvariant="normal">系</mi><mi mathvariant="normal">数</mi><mo>×</mo><mo stretchy="false">(</mo><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">期</mi><mi mathvariant="normal">预</mi><mi mathvariant="normal">测</mi><mi mathvariant="normal">误</mi><mi mathvariant="normal">差</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">第t期预测值=第t-1期预测值+平滑系数\times(第t-1期预测误差)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">预</span><span class="mord cjk_fallback">测</span><span class="mord cjk_fallback">值</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69841em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">预</span><span class="mord cjk_fallback">测</span><span class="mord cjk_fallback">值</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">平</span><span class="mord cjk_fallback">滑</span><span class="mord cjk_fallback">系</span><span class="mord cjk_fallback">数</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">预</span><span class="mord cjk_fallback">测</span><span class="mord cjk_fallback">误</span><span class="mord cjk_fallback">差</span><span class="mclose">)</span></span></span></span></span></p><p>第t-1期预测误差：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">期</mi><mi mathvariant="normal">预</mi><mi mathvariant="normal">测</mi><mi mathvariant="normal">误</mi><mi mathvariant="normal">差</mi><mo>=</mo><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">期</mi><mi mathvariant="normal">实</mi><mi mathvariant="normal">际</mi><mi mathvariant="normal">值</mi><mo>−</mo><mi mathvariant="normal">第</mi><mi>t</mi><mo>−</mo><mn>1</mn><mi mathvariant="normal">期</mi><mi mathvariant="normal">预</mi><mi mathvariant="normal">测</mi><mi mathvariant="normal">值</mi></mrow><annotation encoding="application/x-tex">第t-1期预测误差=第t-1期实际值-第t-1期预测值</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69841em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">预</span><span class="mord cjk_fallback">测</span><span class="mord cjk_fallback">误</span><span class="mord cjk_fallback">差</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69841em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">实</span><span class="mord cjk_fallback">际</span><span class="mord cjk_fallback">值</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69841em;vertical-align:-0.08333em;"></span><span class="mord cjk_fallback">第</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord cjk_fallback">期</span><span class="mord cjk_fallback">预</span><span class="mord cjk_fallback">测</span><span class="mord cjk_fallback">值</span></span></span></span></span></p></blockquote><h2 id="计算经济订货批量eoq模型"><a class="markdownIt-Anchor" href="#计算经济订货批量eoq模型"></a> 【计算】经济订货批量EOQ模型</h2><blockquote><p>用来处理具有稳定需求的单一产品库存问题，即产品在单位时间的需求量是一个常数</p><p><strong>需求总体来说稳定</strong></p></blockquote><p>不允许缺货，单位时间的需求为D，每件产品单位时间的保存成本为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>C</mi><mi>h</mi></msub></mrow><annotation encoding="application/x-tex">C_h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，每次订货成本为A，订货量为Q，如何确定Q？</p><p><mark>先统一单位！！！</mark></p><p>总成本最小的最优Q为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>Q</mi><mo>∗</mo></msup><mo>=</mo><msqrt><mfrac><mrow><mn>2</mn><mi>A</mi><mi>D</mi></mrow><msub><mi>C</mi><mi>h</mi></msub></mfrac></msqrt></mrow><annotation encoding="application/x-tex">Q^*=\sqrt{\frac{2AD}{C_h}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.933136em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.44em;vertical-align:-0.8439600000000003em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5960399999999997em;"><span class="svg-align" style="top:-4.4em;"><span class="pstrut" style="height:4.4em;"></span><span class="mord" style="padding-left:1em;"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.3139999999999996em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8360000000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.5560400000000003em;"><span class="pstrut" style="height:4.4em;"></span><span class="hide-tail" style="min-width:1.02em;height:2.48em;"><svg width='400em' height='2.48em' viewBox='0 0 400000 2592' preserveAspectRatio='xMinYMin slice'><path d='M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8439600000000003em;"><span></span></span></span></span></span></span></span></span></span></p><p>最低总库存成本：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>C</mi><mo>∗</mo></msup><mo>=</mo><msqrt><mrow><mn>2</mn><mi>A</mi><mi>D</mi><msub><mi>C</mi><mi>h</mi></msub></mrow></msqrt></mrow><annotation encoding="application/x-tex">C^*=\sqrt{2ADC_h}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.738696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.738696em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.23946em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.00054em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">2</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">h</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.96054em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg width='400em' height='1.28em' viewBox='0 0 400000 1296' preserveAspectRatio='xMinYMin slice'><path d='M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.23946em;"><span></span></span></span></span></span></span></span></span></span></p><blockquote><p>单位时间内订货次数=<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mi>D</mi><mi>Q</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{D}{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3534389999999998em;vertical-align:-0.481108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.872331em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">Q</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p>订购成本=<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>×</mo><mfrac><mi>D</mi><mi>Q</mi></mfrac></mrow><annotation encoding="application/x-tex">A\times\frac{D}{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.3534389999999998em;vertical-align:-0.481108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.872331em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">Q</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p>保存成本=<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mo>×</mo><mfrac><mi>Q</mi><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">C\times\frac{Q}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.269439em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.924439em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.446108em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">Q</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mo stretchy="false">(</mo><mi>Q</mi><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi><mo>×</mo><mfrac><mi>D</mi><mi>Q</mi></mfrac><mo>+</mo><mi>C</mi><mo>×</mo><mfrac><mi>Q</mi><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">C(Q)=A\times\frac{D}{Q}+C\times\frac{Q}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mopen">(</span><span class="mord mathdefault">Q</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">A</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.3534389999999998em;vertical-align:-0.481108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.872331em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">Q</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.269439em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.924439em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.446108em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">Q</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span> ，求导</p></blockquote><h2 id="计算看板数量"><a class="markdownIt-Anchor" href="#计算看板数量"></a> 【计算】看板数量</h2><p>单位时间需求量为D，上道工序生产a件产品并搬运到下道工序的时间为L（包括生产准备时间），给定安全系数为S，看板数量计算公式：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo>≥</mo><mfrac><mrow><mi>D</mi><mi>L</mi><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>s</mi><mo stretchy="false">)</mo></mrow><mi>a</mi></mfrac></mrow><annotation encoding="application/x-tex">k\geq\frac{DL(1+s)}{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83041em;vertical-align:-0.13597em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.113em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">s</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>k取不小于下限值的最小整数。</p><h1 id="供应链管理"><a class="markdownIt-Anchor" href="#供应链管理"></a> 供应链管理</h1><blockquote><p>多个企业以供应-需求关系为基础，组成了链状或者网状结构称为供应链</p><ul><li>供应链是企业所面临的固有环境</li><li>从其上游企业采购所必须的生产要素</li><li>借助下游企业分销自己的商品</li></ul></blockquote><p>结构：</p><ul><li>纵向一体化：大而全【美团：外卖，借贷】<ul><li>缺：企业庞大臃肿，投资大，风险高，竞争力分散</li></ul></li><li>横向一体化：与其他企业密切合作，降低市场交易成本</li></ul><p><mark>供应链管理：四流一关系【物信工资】——物流，信息流，资金流，工作流/商流，贸易伙伴关系</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152208985.png" alt="" /></p><p>供应链流程：工作流；供应链上的业务由一系列流程组成</p><p>两类工业工作流：</p><p>1.相邻环节之间的业务循环流<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152212325.png" alt="" /></p><p>2.整条供应链的产品增值流</p><p><strong>供应链式增值链：原材料→零部件→成品→分销→零售→顾客</strong></p><p>原材料→零部件→成品：注入有形的物质和付出劳动使产品价值不断增长</p><p>分销→零售→顾客：提高便利性——服务增值，注入劳动提高产品满足需求的能力</p><p><strong><mark>推/拉过程的结合</mark></strong></p><ul><li><p>中低档：推/拉分界点接近销售终端<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152216180.png" alt="" /></p></li><li><p>高档：按单生产<img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152216435.png" alt="" /></p></li></ul><p>供应链战略匹配：</p><blockquote><p>需求的不确定性越大，供应链的响应性（服务时间准时性，批量、品种的柔性）越强</p></blockquote><p>供应链响应性与生产效率成反比</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152219111.png" alt="" /></p><p><strong>核心问题</strong>：通过合理规划物流、资金流、信息流在供应链上的 分布，将<strong>不确定性（风险）合理分配给供应链上的不同角色</strong>。</p><p><mark>谁存货谁承担责任越大！！！</mark></p><p>中低档家具：零售端。高档：制造商，高价格支撑高成本</p><p>供应链分销结构：</p><blockquote><p>存货前伸的程度或位置不同，不同存货位置对整条供应链的响应性、物流成本、库存成本的影响都不一样</p></blockquote><ul><li>制造商存货+直送</li><li>分销商存货+到户交付</li><li>终端存货+顾客自提</li></ul><p>供应链物流网络规划考虑多种因素：战略，成本，技术，客户，竞争，政治/社会，经济环境，基础设施</p><p><strong>规划与运作：计划、采购、制造、支付</strong></p><ul><li>计划：规划和组织其余三个环节的主要业务活动</li><li>采购：外包政策，合同管理，供应商管理</li><li>制造：产品设计，生产管理</li><li>交付：订单管理，交货调度，你想物流</li></ul><p>物流管理：</p><ul><li>第三方物流：产品提供方与需求方以外的专业物流公司</li><li>第四方物流：第三方物流的高级化，需要进一步为货主考虑运输量，路线，存储位置，<strong>为整条供应链优化</strong></li></ul><p><font color='orange'><strong>牛鞭效应</strong></font></p><p>供应链失调：供需不能同步</p><p><mark>牛鞭效应：客户需求的微小波动，会引起上游制造商、供应商等所获信息的剧烈变化。</mark></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152241246.png" alt="" /></p><p><strong>主要原因：</strong></p><ul><li>信息加工：放大需求预测</li><li>配给和短缺博弈：制造商产能不足，就以订的多得到的多分配，而零售商为了获取更多配额，所下订单比实际多</li><li>大批量效应：数量折扣等</li><li>价格恐惧：害怕涨价，提前大量订货</li><li>其他：缺货恐惧，促销和提前订购</li></ul><p><strong><mark>解决原则：共享信息，建立可靠的战略合作伙伴关系</mark></strong></p><p>方法：</p><ul><li>库存共享：零售商共享中央仓库，大量库存由中央仓库统一储备</li><li>供应商管理库存：省去中间传递环节</li><li>协同计划、预测和补货</li></ul><h1 id="质量管理"><a class="markdownIt-Anchor" href="#质量管理"></a> 质量管理</h1><blockquote><p>质量：一组<strong>固有特性</strong>满足要求的程度。</p></blockquote><p><strong>质量管理大师</strong>：</p><ul><li><p>戴明：戴明环——PDCA循环：计划，执行，检查，处理</p></li><li><p>“朱兰”三部曲：质量计划，质量控制，质量改进，质量螺旋曲线</p></li><li><p>克劳斯比：“零缺陷”质量管理</p></li><li><p>费根堡姆：全面质量控制</p></li><li><p>石川馨：因果图</p></li></ul><p>质量管理工具：调查表/检查表：粗略原因分析，分层法，排列图：寻找主要问题，因果图：原因—结果，手段—目标，直方图，散点图，控制图：±3σ原理，<strong>上下控制线不是3σ线</strong>。</p><p>质量成本=质量运行成本+质量故障（损失）成本</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152303405.png" alt="" /></p><p>6 σ的作业流程改进：DMAIC过程</p><p>6σ管理的流程包括：<strong>定义(Define)、测量(Measure)、分析 (Analyze)、 改进(Improve)、控制(Control)</strong>。</p><p>【定测分改控】定义，测量，分析，改进，控制</p><h2 id="判断判稳原则"><a class="markdownIt-Anchor" href="#判断判稳原则"></a> 【判断】判稳原则</h2><p>不稳准则：</p><ul><li>点出界</li><li>连续9个点落在中心线同一侧</li><li>连续六个点递增或递减</li><li>连续14个点上下交替</li><li>连续三个点中有两个点落入中心线同一侧的B区以外</li><li>连续5点中，4个点落入中心线同一侧的C区以外</li><li>连续15点全部在中心线两侧C区以内</li><li>连续8点在中心线两侧，却无任何一点在C区内</li></ul><h1 id="项目管理"><a class="markdownIt-Anchor" href="#项目管理"></a> 项目管理</h1><p><strong>项目：独特性，临时性</strong></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152308612.png" alt="" /></p><p>项目管理技术：工作分解结构WBS，责任分配矩阵，关键路径法，计划评审技术，挣值分析</p><p>挣值分析需要获取三种不同的费用值：<strong>计划价值、挣得值（被确认的项目工作价值）、实际成本</strong>。</p><ul><li>计划价值PV：在某个检查点，按计划应完成的工作量所对应的预算成本</li><li>挣得值EV：经过验收且符合质量要求的工作，基于实际完成的比例， <mark>按照预算标准折算后的价值</mark></li><li>实际成本AC：已完成的工作消耗的实际费用</li></ul><p>成本偏差：EV-AC</p><p>进度偏差：EV-PV</p><p><strong>工作分解结构WBS</strong>：用于界定项目工作范围，它是以可交付物为导向的工作层级分解，所分解的对象是项目团队为实现项目目标、提交所需可 交付成果 而实施的工作，其最低层次称为工作包。</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152313721.png" alt="" /></p><p><strong>责任分配矩阵RAM</strong>：将WBS与项目干系人联系起来的二维表。</p><p>R：谁的职责执行</p><p>A：签字批准，负责人</p><p>C：向谁咨询</p><p>I：工作进展情况通知</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406152315103.png" alt="" /></p><h2 id="大题关键路径"><a class="markdownIt-Anchor" href="#大题关键路径"></a> 【大题】关键路径</h2><p>DU：活动持续时间</p><p>ES：最早开始时间——等晚不等早</p><p>EF：最早完成时间</p><p>LS：最晚开始时间——赶早不敢晚</p><p>LF：最晚开始时间</p><p>TF：总浮动时间LF-EF</p><p>FF：自由浮动时间 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><mi>n</mi><mrow><mi>E</mi><msub><mi>S</mi><mi>j</mi></msub><mo>−</mo><msub><mi>t</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>−</mo></mrow><mi>E</mi><msub><mi>F</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">min{ES_j-t_{ij}-}EF_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord">−</span></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，后左上-前右上-时间差</p><p>时间依赖的逻辑关系：FS（Finish-Start），FF（Finish-Finish），SS（start-start）——全部转化为FS</p><h1 id="投资项目经济分析"><a class="markdownIt-Anchor" href="#投资项目经济分析"></a> 投资项目经济分析</h1><ol><li>投资者角度：项目分为<strong>建设和运营</strong>两个阶段。</li><li>项目的技术可行性、总收益是否能补偿全部投资支出：<mark>技术经济评价</mark>。</li><li>投资形成的资产：<strong>固定资产、无形资产、递延资产（前三个为多个生产周期）、流动资产（单个营业周期）</strong>。</li><li>折旧：固定资产在生产经营过程中因使用损耗而造成的价值减少（转移到产品中形成了产品价值的 一部分）</li><li><strong>生产成本=直接成本/变动成本+制造费用</strong></li><li>期间费用（非直接生产部门的费用）：管理费用，财务费用，销售费用</li><li><strong>净现金流 = 利润 + 折旧 + 资产类摊销</strong>。<ul><li>某支付周期的收入和支出的代数和。</li></ul></li><li>净现金流的抵减项：<strong>折旧费、管理费用</strong>。</li><li>经营成本=总成本-折旧-资产类摊销</li></ol><h2 id="计算利润"><a class="markdownIt-Anchor" href="#计算利润"></a> 【计算】利润</h2><p>利润=销售收入-总成本</p><p>销售收入=销售量*单价</p><p>总成本=生产成本+期间费用</p><p>生产成本=直接成本/变动成本+制造费用</p><h2 id="计算折旧"><a class="markdownIt-Anchor" href="#计算折旧"></a> 【计算】折旧</h2><ul><li>直线折旧法：将投资平摊到寿命的每一年</li><li>残值折旧：折旧=（固定资产原值-残值）/使用年限</li><li>工作量折旧：车</li></ul><h2 id="计算净现金流和利润"><a class="markdownIt-Anchor" href="#计算净现金流和利润"></a> 【计算】净现金流和利润</h2><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191127751.png" alt="" /></p><p>利润=200-40-50=110万</p><p>净现金流=利润+折旧=160万</p><h2 id="计算利息"><a class="markdownIt-Anchor" href="#计算利息"></a> 【计算】利息</h2><h3 id="单利"><a class="markdownIt-Anchor" href="#单利"></a> 单利</h3><blockquote><p>只计本金利息，利息本身不再作为利息基础</p></blockquote><p>P-本金，n-计息期数，i-利率</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>=</mo><mi>P</mi><mo>+</mo><mi>I</mi><mo>=</mo><mi>P</mi><mo>×</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>n</mi><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo>+</mo><mi>P</mi><mi>n</mi><mi>i</mi></mrow><annotation encoding="application/x-tex">F=P+I=P\times(1+ni)=P+Pni</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191139956.png" alt="" /></p><p>1000+1000*4*6%=1240</p><h3 id="复利"><a class="markdownIt-Anchor" href="#复利"></a> 复利</h3><blockquote><p>除了本金以外，利息也作为计算下一个计息期利息的基础</p></blockquote><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>=</mo><mi>P</mi><mo>+</mo><mi>I</mi><mo>=</mo><mi>P</mi><mo>×</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>i</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">F=P+I=P\times(1+i)^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7143919999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span></p><h2 id="计算还贷"><a class="markdownIt-Anchor" href="#计算还贷"></a> 【计算】还贷</h2><p>等额本息还款法</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>M</mi><mo>=</mo><mi>P</mi><mo>×</mo><mfrac><mrow><mo stretchy="false">[</mo><mi>r</mi><mo>×</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup><mo stretchy="false">]</mo></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>r</mi><msup><mo stretchy="false">)</mo><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow></mfrac></mrow><annotation encoding="application/x-tex">M=P\times\frac{[r\times(1+r)^n]}{(1+r)^n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.590392em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>r为月利率，即年利率/12，n还贷期数（月）</p><h2 id="大题现金流量图"><a class="markdownIt-Anchor" href="#大题现金流量图"></a> 【大题】现金流量图</h2><p>净现金流量：某支付周期的收入和支出的代数和。</p><p><mark>支出发生在年初，收入发生在年末</mark></p><p>支出箭头向下，收入箭头向上，箭头末表明钱数</p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191130744.png" alt="" /></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191131817.png" alt="" /></p><h2 id="大题净现值npv内部收益率irr评价方案"><a class="markdownIt-Anchor" href="#大题净现值npv内部收益率irr评价方案"></a> 【大题】净现值NPV，内部收益率IRR评价方案</h2><p>NPV&gt;0则可行，IRR大于基准折现率则可行。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>N</mi><mi>P</mi><msub><mi>V</mi><mi>i</mi></msub><mo>=</mo><mo>−</mo><mi mathvariant="normal">投</mi><mi mathvariant="normal">资</mi><mo>+</mo><mfrac><mrow><mi mathvariant="normal">第</mi><mi mathvariant="normal">一</mi><mi mathvariant="normal">年</mi></mrow><mrow><mn>1</mn><mo>+</mo><mi>x</mi><mi mathvariant="normal">%</mi></mrow></mfrac><mo>+</mo><mo>+</mo><mfrac><mrow><mi mathvariant="normal">第</mi><mi mathvariant="normal">二</mi><mi mathvariant="normal">年</mi></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>x</mi><mi mathvariant="normal">%</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant="normal">第</mi><mi mathvariant="normal">三</mi><mi mathvariant="normal">年</mi></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>x</mi><mi mathvariant="normal">%</mi><msup><mo stretchy="false">)</mo><mn>3</mn></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">NPV_i=-投资+\frac{第一年}{1+x\%}++\frac{第二年}{(1+x\%)^2}+\frac{第三年}{(1+x\%)^3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord cjk_fallback">投</span><span class="mord cjk_fallback">资</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.4463300000000001em;vertical-align:-0.7693300000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span><span class="mord">%</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">第</span><span class="mord cjk_fallback">一</span><span class="mord cjk_fallback">年</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.613em;vertical-align:-0.936em;"></span><span class="mord">+</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span><span class="mord">%</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">第</span><span class="mord cjk_fallback">二</span><span class="mord cjk_fallback">年</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.613em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.677em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span><span class="mord">%</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">第</span><span class="mord cjk_fallback">三</span><span class="mord cjk_fallback">年</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191200399.png" alt="" /></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mi>R</mi><mi>R</mi><mo>=</mo><msub><mi>i</mi><mn>1</mn></msub><mo>+</mo><mfrac><mrow><mo stretchy="false">(</mo><msub><mi>i</mi><mn>2</mn></msub><mo>−</mo><msub><mi>i</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mi>N</mi><mi>P</mi><msub><mi>V</mi><mn>1</mn></msub></mrow><mrow><mi>N</mi><mi>P</mi><msub><mi>V</mi><mn>1</mn></msub><mo>+</mo><mi mathvariant="normal">∣</mi><mi>N</mi><mi>P</mi><msub><mi>V</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">IRR=i_1+\frac{(i_2-i_1)NPV_{1}}{NPV_1+|NPV_2|}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80952em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.22222em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><img src="https://gitee.com/bxrbxr/images/raw/master/imgs/202406191204755.png" alt="" /></p><p>在于基准收益率比较。</p><h2 id="计算静态投资回收期"><a class="markdownIt-Anchor" href="#计算静态投资回收期"></a> 【计算】静态投资回收期</h2><p>不考虑资金时间价值，单纯回收。如果不是整数年就平均一下。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot; /&gt;
&lt;h1 id=&quot;经济问题与经济学&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#经济问题与经济学&quot;&gt;&lt;/a&gt; 经济问题与经济学&lt;/h1&gt;
&lt;p&gt;经济问题的产生</summary>
      
    
    
    
    <category term="大二下" scheme="http://example.com/categories/%E5%A4%A7%E4%BA%8C%E4%B8%8B/"/>
    
    
    <category term="笔记" scheme="http://example.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="经济管理" scheme="http://example.com/tags/%E7%BB%8F%E6%B5%8E%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
</feed>
