<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>printsdf&apos;s Blog</title><description>A personal blog powered by Firefly theme</description><link>https://printsdf.dpdns.org/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.6.1</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年4月24日 17:04:58</lastBuildDate><item><title>大模型 1/?</title><link>https://printsdf.dpdns.org/posts/llm-1/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/llm-1/</guid><description>大模型基础的系列博客讲解，目的是以费曼学习法的方式让自己真正打牢大模型的基础</description><pubDate>Sat, 24 Jan 2026 07:28:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;我们向 GPT 输入的文字是如何被它处理的？&lt;a href=&quot;#我们向-gpt-输入的文字是如何被它处理的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;众所周知，计算机是不理解人类的自然语言，所以需要做一些适配计算机的处理。例如下方的图片，我们输入“The cat sat ___”，它会经历下面几个流程：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;首先是分词，计算机的单位是 Token（词元） 而不是单词，我们会使用一个分词算法 &lt;strong&gt;BPE&lt;/strong&gt; 将单词划分为 Token。&lt;/li&gt;
&lt;li&gt;之后这些 Token （包括位置编码）便会进入到 Embedding Matrix，这个矩阵的作用是将刚才我们输入的自然语言转换为这个 Token 的特征向量。&lt;/li&gt;
&lt;li&gt;经过 Transformer 层之后我们选取最后一列作为 GPT 的预测特征向量，通过 Unembedding Matrix 将特征向量又转换为 Token，从而实现了自然语言的输入与输出过程。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/ml85mmzz-9391e0529983.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;而这其实就是所谓的“Embedding”，即将自然语言转换为计算机能够理解的数字向量，这些向量并不是随机的数字组合，&lt;strong&gt;它们其实是带有语义信息的&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;经典案例：国王与王后的数学逻辑&lt;/strong&gt;&lt;a href=&quot;#经典案例国王与王后的数学逻辑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在高质量的 Embedding 模型中，你会发现以下有趣的现象：&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Vector(“国王”)−Vector(“男人”)+Vector(“女人”)≈Vector(“王后”)Vector(\text{“国王”}) - Vector(\text{“男人”}) + Vector(\text{“女人”}) \approx Vector(\text{“王后”})
&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;ec&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;国王&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;ec&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;男人&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;ec&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;女人&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;ec&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;王后&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;这个公式背后的逻辑是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提取特征&lt;/strong&gt;：当“国王”减去“男人”，模型实际上在语义层面去掉了“男性”这个维度，剩下了“皇室/统治者”的核心含义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;赋予特征&lt;/strong&gt;：再加上“女人”，模型将“皇室/统治者”与“女性”特征结合，最终指向了空间中距离“王后”最近的坐标点。&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;除了加减法，Embedding 的强大之处还在于距离。
在计算机的向量空间里，意思相近的词，其坐标位置也非常接近。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“苹果”和“梨”的距离，会比“苹果”和“自行车”的距离近得多。&lt;/li&gt;
&lt;li&gt;“开心”和“愉悦”在多维空间中几乎是重叠的，而“开心”和“愤怒”则会处于截然相反的方向。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这种特性让计算机不再只是进行简单的“字符串匹配”，而是真正开始“理解”内容。即使你搜索“好吃的红果子”，Embedding 也能让搜索引擎联想到“苹果”或“草莓”，因为它知道这些词在语义空间里是邻居。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Embedding 的本质：高维特征映射&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果把每一个词看作一个多维度的“身份标签”，Embedding 就像是在给每个词打分。一个 512 维的向量，意味着计算机从 512 个不同的角度（虽然这些角度对人类来说可能难以直接描述）去审视这个词：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;维度描述 (假设)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;“猫” 的数值&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;“狗” 的数值&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;“手机” 的数值&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dim 1&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;是否为生物&lt;/td&gt;&lt;td&gt;0.98&lt;/td&gt;&lt;td&gt;0.99&lt;/td&gt;&lt;td&gt;0.02&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dim 2&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;是否有毛发&lt;/td&gt;&lt;td&gt;0.95&lt;/td&gt;&lt;td&gt;0.92&lt;/td&gt;&lt;td&gt;0.01&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dim 3&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;是否为电子产品&lt;/td&gt;&lt;td&gt;0.01&lt;/td&gt;&lt;td&gt;0.02&lt;/td&gt;&lt;td&gt;0.97&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;通过这种方式，自然语言的模糊性被转化为了数学的精确性。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>获取 Outlook Refresh Token</title><link>https://printsdf.dpdns.org/posts/2026-04-16-%E8%8E%B7%E5%8F%96-outlook-refresh-token/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/2026-04-16-%E8%8E%B7%E5%8F%96-outlook-refresh-token/</guid><description>获取 Outlook Refresh Token</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在使用 Outlook（Microsoft 365 / Hotmail）进行邮件自动化、IMAP/SMTP 登录或开发项目时，经常需要获取 &lt;strong&gt;Refresh Token&lt;/strong&gt;。但很多在线工具容易出现 &lt;code&gt;different client id&lt;/code&gt; 或 &lt;code&gt;invalid_scope&lt;/code&gt; 等问题。&lt;/p&gt;
&lt;p&gt;本文提供一个 &lt;strong&gt;纯浏览器 + curl&lt;/strong&gt; 的稳定方法，无需注册应用、无需安装复杂工具，适合 macOS 用户。&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;适用场景&lt;a href=&quot;#适用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;需要长期使用 Outlook IMAP / SMTP&lt;/li&gt;
&lt;li&gt;自动化收发邮件、获取验证码等&lt;/li&gt;
&lt;li&gt;不想自己注册 Azure App&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;使用到的 Client ID&lt;a href=&quot;#使用到的-client-id&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我们使用 Thunderbird 的公开 Client ID（社区最常用、最稳定）：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Client ID&lt;/strong&gt;: &lt;code&gt;9e5f94bc-e8a4-4e73-b8be-63364c29d753&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;详细操作步骤&lt;a href=&quot;#详细操作步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;步骤 1：获取授权码（Authorization Code）&lt;a href=&quot;#步骤-1获取授权码authorization-code&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开 Safari 或 Chrome 浏览器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整复制&lt;/strong&gt;下面这个链接并粘贴到地址栏打开：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=9e5f94bc-e8a4-4e73-b8be-63364c29d753&amp;amp;response_type=code&amp;amp;redirect_uri=https://localhost&amp;amp;response_mode=query&amp;amp;scope=offline_access%20https://outlook.office.com/IMAP.AccessAsUser.All%20https://outlook.office.com/POP.AccessAsUser.All%20https://outlook.office.com/SMTP.Send&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;使用你的 Outlook / Hotmail 账号登录。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;接受&lt;/strong&gt; 或 &lt;strong&gt;同意&lt;/strong&gt; 所有请求的权限。&lt;/li&gt;
&lt;li&gt;页面会跳转失败（显示无法连接 localhost，这是正常现象）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;立即&lt;/strong&gt; 在地址栏找到 &lt;code&gt;code=&lt;/code&gt; 后面的那一长串字符，&lt;strong&gt;完整复制&lt;/strong&gt;（从 &lt;code&gt;code=&lt;/code&gt; 开始，直到下一个 &lt;code&gt;&amp;amp;&lt;/code&gt; 符号之前）。&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 注意：授权码有效期很短（约 5-10 分钟），请尽快进行下一步。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;步骤 2：用授权码换取 Refresh Token&lt;a href=&quot;#步骤-2用授权码换取-refresh-token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开 Mac 的 &lt;strong&gt;终端&lt;/strong&gt;（Terminal）。&lt;/li&gt;
&lt;li&gt;复制下面整条命令：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://login.microsoftonline.com/common/oauth2/v2.0/token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;client_id=9e5f94bc-e8a4-4e73-b8be-63364c29d753&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;scope=offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;code=你的授权码&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;grant_type=authorization_code&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;redirect_uri=https://localhost&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;把上面命令中的 &lt;code&gt;你的授权码&lt;/code&gt; &lt;strong&gt;替换&lt;/strong&gt;为你刚刚复制的那一长串 code（注意不要加空格或额外引号）。&lt;/li&gt;
&lt;li&gt;按回车执行。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;步骤 3：查看返回结果&lt;a href=&quot;#步骤-3查看返回结果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果操作成功，你会看到类似下面的 JSON 返回：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;token_type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Bearer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;scope&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;expires_in&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3600&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;access_token&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;EwAw...&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;refresh_token&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;0.AwAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重点复制&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;refresh_token&lt;/code&gt; 的值（以 &lt;code&gt;0.AwA&lt;/code&gt; 开头的那一长串）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client_id&lt;/code&gt;：&lt;code&gt;9e5f94bc-e8a4-4e73-b8be-63364c29d753&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;常见问题与解决&lt;a href=&quot;#常见问题与解决&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;zsh: event not found&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决：确保所有 &lt;code&gt;-d &apos;内容&apos;&lt;/code&gt; 都用&lt;strong&gt;单引号&lt;/strong&gt; &lt;code&gt;&apos;&lt;/code&gt; 包裹。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The code has expired&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决：授权码过期了，重新执行步骤 1 获取新的 code，然后立即执行步骤 2。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;invalid_scope&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决：确认 scope 只使用了 &lt;code&gt;outlook.office.com&lt;/code&gt; 系列，不要和 &lt;code&gt;graph.microsoft.com&lt;/code&gt; 混用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;invalid_grant: different client id&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决：必须使用上面固定的 Client ID，不能和在线工具混用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;后续使用建议&lt;a href=&quot;#后续使用建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;client_id&lt;/code&gt; 和 &lt;code&gt;refresh_token&lt;/code&gt; 安全保存。&lt;/li&gt;
&lt;li&gt;Refresh Token 有效期通常为 90 天左右，建议定期刷新。&lt;/li&gt;
&lt;li&gt;在代码中使用时，推荐用 &lt;code&gt;refresh_token&lt;/code&gt; 定期换取新的 &lt;code&gt;access_token&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>CS336 2/？</title><link>https://printsdf.dpdns.org/posts/cs336-2/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/cs336-2/</guid><description>从 CS336 开始打牢 LLM 基础</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;从零实现 BPE Tokenizer：CS336 实战总结&lt;a href=&quot;#从零实现-bpe-tokenizercs336-实战总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;在斯坦福 CS336（大模型基础）课程中，有一个经典的动手作业：从头实现一个 BPE（Byte Pair Encoding）Tokenizer。这篇文章记录了完整的实现思路、核心数据结构，以及那些真实踩过的坑。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;什么是 BPE Tokenizer？&lt;a href=&quot;#什么是-bpe-tokenizer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;BPE Tokenizer 的核心职责很简单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;encode&lt;/strong&gt;：把一段文本转换成 token ID 序列&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;decode&lt;/strong&gt;：把 token ID 序列还原回文本&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;看起来简单，但实现细节充满陷阱。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;核心数据结构&lt;a href=&quot;#核心数据结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vocab: dict[&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;]        &lt;/span&gt;&lt;span&gt;# ID → bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;merges: list[tuple[&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;]]  &lt;/span&gt;&lt;span&gt;# 按创建顺序排列的合并规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reverse_vocab: dict[&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;]    &lt;/span&gt;&lt;span&gt;# bytes → ID（初始化时构建）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;三个结构各司其职：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vocab&lt;/code&gt; 是主索引，给 decode 用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;merges&lt;/code&gt; 记录了 BPE 训练出的所有合并规则，&lt;strong&gt;顺序至关重要&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse_vocab&lt;/code&gt; 是 &lt;code&gt;vocab&lt;/code&gt; 的反向查找表，初始化时一次性构建，encode 时高频使用&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;encode 流程&lt;a href=&quot;#encode-流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;encode 分两个阶段处理：&lt;strong&gt;special tokens&lt;/strong&gt; 和&lt;strong&gt;普通文本&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第一步：用 special tokens 切分文本&lt;a href=&quot;#第一步用-special-tokens-切分文本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 构建正则，special tokens 按长度降序排列&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;sorted_specials &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.special_tokens, &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;reverse&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;pattern &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;(&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;|&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(re.&lt;/span&gt;&lt;span&gt;escape&lt;/span&gt;&lt;span&gt;(s) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; s &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; sorted_specials) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;parts &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; regex.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;(pattern, text)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点 1：用捕获组&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;(...)&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;而不是非捕获组&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;(?:...)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;regex.split&lt;/code&gt; 如果用非捕获组，分隔符本身会从结果中消失——special token 就丢了。用捕获组才能让 special token 出现在 split 结果里。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关键点 2：special tokens 必须按长度降序排列&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果有 &lt;code&gt;&amp;lt;|im_start|&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;|im|&amp;gt;&lt;/code&gt; 两个 special token，短的不能优先匹配，否则长的永远匹配不到。排序后构建正则，优先尝试最长匹配。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关键点 3：用排序后的变量构建正则&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这听起来是废话，但实际上很容易写成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 错误写法：忘了用排序后的变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;pattern &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;(&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;|&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(re.&lt;/span&gt;&lt;span&gt;escape&lt;/span&gt;&lt;span&gt;(s) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; s &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.special_tokens) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;必须用 &lt;code&gt;sorted_specials&lt;/code&gt;，不能用原始的 &lt;code&gt;self.special_tokens&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：分别处理每个片段&lt;a href=&quot;#第二步分别处理每个片段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; part &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; parts:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; part &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.special_tokens:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ids.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.reverse_vocab[part.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;)])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ids.&lt;/span&gt;&lt;span&gt;extend&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;_encode_chunk&lt;/span&gt;&lt;span&gt;(part))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;special token 片段：直接查 &lt;code&gt;reverse_vocab&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;普通文本片段：走 &lt;code&gt;_encode_chunk&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;_encode_chunk&lt;/code&gt;：BPE 合并的核心&lt;a href=&quot;#_encode_chunkbpe-合并的核心&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;_encode_chunk&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) -&amp;gt; list[&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;]:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 1. 预分词（用 GPT-2 / tiktoken 风格的 regex）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pretokenize&lt;/span&gt;&lt;span&gt;(text)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ids &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; word &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; words:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 2. UTF-8 编码，转成 tuple[bytes, ...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tokens &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tuple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;([b]) &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; word.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 3. 按顺序应用所有 merges&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; pair &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.merges:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tokens &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apply_merge&lt;/span&gt;&lt;span&gt;(tokens, pair)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 4. 查 reverse_vocab 得到 ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ids.&lt;/span&gt;&lt;span&gt;extend&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.reverse_vocab[t] &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; t &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; tokens)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; ids&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点：字节迭代的陷阱&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Python 中，对 &lt;code&gt;bytes&lt;/code&gt; 对象直接迭代得到的是&lt;strong&gt;整数&lt;/strong&gt;，不是单字节 &lt;code&gt;bytes&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;(b))  &lt;/span&gt;&lt;span&gt;# &amp;lt;class &apos;int&apos;&amp;gt;，不是 bytes！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;所以必须用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tuple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;([b]) &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; word.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;而不是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tuple&lt;/span&gt;&lt;span&gt;&lt;span&gt;(word.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;))  &lt;/span&gt;&lt;span&gt;# 得到整数 tuple，查 reverse_vocab 会 KeyError&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;decode 流程&lt;a href=&quot;#decode-流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;decode 相对简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ids&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; list[&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;) -&amp;gt; &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.vocab[i] &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; ids).&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;replace&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;先把每个 ID 映射回 bytes，拼接后统一做 UTF-8 解码。用 &lt;code&gt;errors=&apos;replace&apos;&lt;/code&gt; 处理边界处可能出现的不完整 UTF-8 序列。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;踩坑总结&lt;a href=&quot;#踩坑总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;坑&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;th&gt;解法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;special token 从 split 结果消失&lt;/td&gt;&lt;td&gt;用了非捕获组 &lt;code&gt;(?:...)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;改成捕获组 &lt;code&gt;(...)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;长 special token 匹配失败&lt;/td&gt;&lt;td&gt;正则未排序，短 token 优先&lt;/td&gt;&lt;td&gt;按长度降序排列后构建正则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;正则排序没生效&lt;/td&gt;&lt;td&gt;用了原始 &lt;code&gt;self.special_tokens&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用排序后的 &lt;code&gt;sorted_specials&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;reverse_vocab&lt;/code&gt; 查找 KeyError&lt;/td&gt;&lt;td&gt;字节迭代得到整数而非 bytes&lt;/td&gt;&lt;td&gt;用 &lt;code&gt;bytes([b])&lt;/code&gt; 包装每个字节&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;BPE Tokenizer 的实现不难，但细节密集。最容易出问题的地方集中在两处：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;正则切分 special tokens&lt;/strong&gt; — 捕获组 vs 非捕获组，以及排序问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 的字节类型行为&lt;/strong&gt; — &lt;code&gt;bytes&lt;/code&gt; 迭代出整数这个反直觉的特性&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;把这些细节搞清楚之后，整个 tokenizer 的逻辑其实非常清晰。理解了这些，再去读 tiktoken 或 HuggingFace tokenizers 的源码，会有一种豁然开朗的感觉。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>CS336 1/？</title><link>https://printsdf.dpdns.org/posts/cs336-1/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/cs336-1/</guid><description>从 CS336 开始打牢 LLM 基础</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;&lt;strong&gt;BPE 算法实现笔记&lt;/strong&gt;&lt;a href=&quot;#bpe-算法实现笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;从零实现 Byte Pair Encoding，记录踩坑与核心洞察。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;什么是 BPE？&lt;/strong&gt;&lt;a href=&quot;#什么是-bpe&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Byte Pair Encoding&lt;/strong&gt;（字节对编码）是构建 LLM 词表的核心算法。&lt;/p&gt;&lt;p&gt;核心思想只有一句话：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;反复找出语料中&lt;strong&gt;最频繁的相邻 token 对&lt;/strong&gt;，将其合并为新 token，直到词表大小达到目标。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;它解决了一个平衡问题：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;粒度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;优点&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;缺点&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;纯字符级&lt;/td&gt;&lt;td&gt;词表小&lt;/td&gt;&lt;td&gt;序列太长，语义弱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;纯词级&lt;/td&gt;&lt;td&gt;语义强&lt;/td&gt;&lt;td&gt;词表爆炸，OOV 问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;BPE&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;两者平衡&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第一步：预分词（Pretokenization）&lt;/strong&gt;&lt;a href=&quot;#第一步预分词pretokenization&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;BPE 训练之前，需要先把文本切成「词」单元。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;为什么需要这一步？&lt;/strong&gt;&lt;a href=&quot;#为什么需要这一步&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果不预分词，BPE 会跨越词边界合并，产生没有语言意义的 token：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;end\nthe&quot;&lt;/code&gt; 里的 &lt;code&gt;d\n&lt;/code&gt; 会被合并 → 无意义&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot; the&quot;&lt;/code&gt;（带空格）和 &lt;code&gt;&quot;the&quot;&lt;/code&gt; 语义不同，却可能被当作同一单元处理&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;GPT-2 的预分词 Pattern&lt;/strong&gt;&lt;a href=&quot;#gpt-2-的预分词-pattern&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 必须用 &lt;code&gt;tiktoken&lt;/code&gt; 实际使用的 pattern，而不是网上流传的版本——两者对换行符处理不同，会导致 merge 顺序偏差。&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import regex&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GPT2_PAT = r&quot;&quot;&quot;&apos;(?:[sdmt]|ll|ve|re)| ?\p{L}++| ?\p{N}++| ?[^\s\p{L}\p{N}]++|\s++$|\s+(?!\S)|\s&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pat = regex.compile(GPT2_PAT)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;必须用 &lt;code&gt;regex&lt;/code&gt; 库（非标准库 &lt;code&gt;re&lt;/code&gt;），因为需要 &lt;code&gt;\p{L}&lt;/code&gt;、&lt;code&gt;\p{N}&lt;/code&gt; 等 Unicode 属性支持。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;关键规则：&lt;strong&gt;空格属于后面那个词&lt;/strong&gt;，&lt;code&gt;&quot; the&quot;&lt;/code&gt; 是一个完整单元。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;处理 Special Tokens&lt;/strong&gt;&lt;a href=&quot;#处理-special-tokens&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Special tokens（如 &lt;code&gt;&amp;lt;|endoftext|&amp;gt;&lt;/code&gt;）不参与 BPE 训练，需要&lt;strong&gt;先切分&lt;/strong&gt;文本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 长的先匹配，防止短的截断长的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;special_tokens = sorted(special_tokens, key=len, reverse=True)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# regex.escape 防止 &amp;lt;| 等字符被解释为正则元字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;split_pat = &quot;|&quot;.join(f&quot;(?:{regex.escape(st)})&quot; for st in special_tokens)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chunks = regex.split(split_pat, text)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;顺序：&lt;code&gt;文本&lt;/code&gt; → &lt;strong&gt;按 special tokens 切分&lt;/strong&gt; → &lt;strong&gt;对每个 chunk 预分词&lt;/strong&gt; → &lt;code&gt;word_freqs&lt;/code&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第二步：数据结构&lt;/strong&gt;&lt;a href=&quot;#第二步数据结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 每个预分词单元（字节 tuple）的出现频次&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;word_freqs: dict[tuple[bytes, ...], int]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 所有相邻 pair 的总频次&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;from collections import Counter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pair_counts: Counter  # (bytes, bytes) -&amp;gt; int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;初始化 vocab&lt;/strong&gt;&lt;a href=&quot;#初始化-vocab&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BPE 从最小单位出发——所有可能的单字节（256 个）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vocab = {i: bytes([i]) for i in range(256)}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for st in special_tokens:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;vocab[len(vocab)] = st.encode(&quot;utf-8&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;初始化 pair_counts&lt;/strong&gt;&lt;a href=&quot;#初始化-pair_counts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for word, freq in word_freqs.items():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;for i in range(len(word) - 1):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pair_counts[(word[i], word[i + 1])] += freq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;第三步：主循环&lt;/strong&gt;&lt;a href=&quot;#第三步主循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;重复 (vocab_size - 初始vocab大小) 次：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1. 找最频繁的 pair&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2. 记录到 merges&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3. 加入 vocab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4. 更新 word_freqs 和 pair_counts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;Tiebreak 规则&lt;/strong&gt;&lt;a href=&quot;#tiebreak-规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;频次相同时，选&lt;strong&gt;字典序更大&lt;/strong&gt;的 pair：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;best_pair = max(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(p for p in pair_counts if pair_counts[p] &amp;gt; 0),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;key=lambda p: (pair_counts[p], p)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;核心优化：增量更新 pair_counts&lt;/strong&gt;&lt;a href=&quot;#核心优化增量更新-pair_counts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;朴素做法（慢）&lt;/strong&gt;&lt;a href=&quot;#朴素做法慢&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每次 merge 后重新扫描全部词，重建 Counter → &lt;code&gt;O(n)&lt;/code&gt; per merge → 太慢。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;高效做法&lt;/strong&gt;&lt;a href=&quot;#高效做法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;每次 merge 之后，只有&lt;strong&gt;被合并 token 的邻居&lt;/strong&gt; pair 会变化，其余不变。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;当把 &lt;code&gt;(a, b)&lt;/code&gt; 合并成 &lt;code&gt;ab&lt;/code&gt; 时，对词 &lt;code&gt;... x  a  b  y ...&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;合并前：... x  a  b  y ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;合并后：... x  ab    y ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;操作&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;pair&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;原因&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;减少&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(x, a)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;x&lt;/code&gt; 的右邻居从 &lt;code&gt;a&lt;/code&gt; 变成了 &lt;code&gt;ab&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;减少&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(b, y)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;y&lt;/code&gt; 的左邻居从 &lt;code&gt;b&lt;/code&gt; 变成了 &lt;code&gt;ab&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;增加&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(x, ab)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新搭档出现&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;增加&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(ab, y)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新搭档出现&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;边界条件：&lt;code&gt;x&lt;/code&gt; 不存在（&lt;code&gt;a&lt;/code&gt; 在词首）或 &lt;code&gt;y&lt;/code&gt; 不存在（&lt;code&gt;b&lt;/code&gt; 在词尾）时跳过对应更新。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if i &amp;gt; 0:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pair_counts[(new_word[-1], a)] -= freq   # 用 new_word[-1] 取左邻居！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pair_counts[(new_word[-1], merged)] += freq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;new_word.append(merged)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if i + 2 &amp;lt; len(word):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pair_counts[(b, word[i + 2])] -= freq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pair_counts[(merged, word[i + 2])] += freq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;⚠️ 踩坑：左邻居索引&lt;/strong&gt;&lt;a href=&quot;#️-踩坑左邻居索引&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;取左邻居时必须用 &lt;code&gt;new_word[-1]&lt;/code&gt;，&lt;strong&gt;不能用&lt;/strong&gt; &lt;code&gt;word[i-1]&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;原因：词 &lt;code&gt;(a, b, a, b)&lt;/code&gt; 中，第二个 &lt;code&gt;(a, b)&lt;/code&gt; 的左邻居已经是 &lt;code&gt;merged&lt;/code&gt;，而不是原词里的 &lt;code&gt;b&lt;/code&gt;。用 &lt;code&gt;word[i-1]&lt;/code&gt; 会指向错误的 token。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;⚠️ 踩坑：****&lt;code&gt;(a, b)&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;自身计数&lt;/strong&gt;&lt;a href=&quot;#️-踩坑a-b-自身计数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;merge 后要立即清除 &lt;code&gt;(a, b)&lt;/code&gt; 的计数，否则下次循环可能重复选同一个 pair：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;a, b = best_pair&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;del pair_counts[best_pair]  # 在更新 word_freqs 之前&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;⚠️ 踩坑：迭代时修改字典&lt;/strong&gt;&lt;a href=&quot;#️-踩坑迭代时修改字典&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;不能在遍历 &lt;code&gt;word_freqs.items()&lt;/code&gt; 的同时修改它，用 &lt;code&gt;to_update&lt;/code&gt; 收集变化，循环后统一更新：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;to_update = {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for word, freq in word_freqs.items():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# ... 构建 new_word ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;to_update[word] = (tuple(new_word), freq)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for old_word, (new_word, freq) in to_update.items():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;del word_freqs[old_word]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;word_freqs[new_word] = word_freqs.get(new_word, 0) + freq&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 用 .get(..., 0) 防止 new_word 原先就存在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;完整流程图&lt;/strong&gt;&lt;a href=&quot;#完整流程图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输入文本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;按 special tokens 切分 → chunks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GPT-2 regex 预分词 → word_freqs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;初始化 vocab（256字节 + special tokens）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;初始化 pair_counts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;┌─────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  找最频繁 pair (tiebreak:大) │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  → 加入 merges, vocab       │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  → 增量更新 pair_counts     │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  → 更新 word_freqs          │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└──────────────┬──────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 重复直到 vocab_size&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(vocab, merges)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;strong&gt;测试要求&lt;/strong&gt;&lt;a href=&quot;#测试要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;corpus.en&lt;/code&gt;，vocab_size=500：&lt;strong&gt;&amp;lt; 1.5 秒&lt;/strong&gt;完成&lt;/li&gt;
&lt;li&gt;merges 顺序必须与 GPT-2 参考实现&lt;strong&gt;完全一致&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;special tokens 不出现在任何 BPE merge 结果中&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>docker镜像更新</title><link>https://printsdf.dpdns.org/posts/2026-03-06-docker%E9%95%9C%E5%83%8F%E6%9B%B4%E6%96%B0/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/2026-03-06-docker%E9%95%9C%E5%83%8F%E6%9B%B4%E6%96%B0/</guid><description>docker镜像更新</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;1. 拉取最新镜像&lt;a href=&quot;#1-拉取最新镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先，你需要从镜像仓库（如 Docker Hub）获取最新版本的镜像。这一步不会影响当前正在运行的服务。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;2. 重新启动服务&lt;a href=&quot;#2-重新启动服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;运行 &lt;code&gt;up -d&lt;/code&gt; 命令。Docker Compose 会自动检测镜像是否发生变化：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如果镜像有更新，它会&lt;strong&gt;停止旧容器&lt;/strong&gt;并&lt;strong&gt;启动新容器&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;如果镜像没有变化，它会保持现状。&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;3. 清理旧镜像（可选）&lt;a href=&quot;#3-清理旧镜像可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;升级完成后，旧的镜像会变成“悬空”状态（无标签），占用磁盘空间。你可以通过以下命令清理：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;💡 核心注意事项&lt;a href=&quot;#-核心注意事项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据持久化&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;确保你的数据存储在 &lt;code&gt;volumes&lt;/code&gt; 中，而不是容器内部。只要挂载了宿主机目录或命名卷，升级容器不会导致数据丢失。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;版本标签 (Tags)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果你在 &lt;code&gt;yaml&lt;/code&gt; 文件中使用的是 &lt;code&gt;:latest&lt;/code&gt; 标签，直接执行上述步骤即可。&lt;/li&gt;
&lt;li&gt;如果你使用的是固定版本号（如 &lt;code&gt;:1.2.1&lt;/code&gt;），你需要先修改 &lt;code&gt;docker-compose.yml&lt;/code&gt; 或 &lt;code&gt;.env&lt;/code&gt; 文件中的版本号，再执行 &lt;code&gt;up -d&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置生效&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;由于你指定了 &lt;code&gt;--env-file .env&lt;/code&gt;，如果你在升级前修改了 &lt;code&gt;.env&lt;/code&gt; 文件中的环境变量，执行 &lt;code&gt;up -d&lt;/code&gt; 时 Docker Compose 也会检测到配置变更并自动重启受影响的容器。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>大模型 3/？ </title><link>https://printsdf.dpdns.org/posts/llm-3/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/llm-3/</guid><description>大模型基础的系列博客讲解，目的是以费曼学习法的方式让自己真正打牢大模型的基础</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这里是讲解Transformer 的博客，但是笔者暂时不想讲，先放一张图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/562eba93bdaf68ad.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Question&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;TODO
暂定 2.6 之后，再沉淀一下&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content:encoded></item><item><title>大模型 2/？</title><link>https://printsdf.dpdns.org/posts/llm-2/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/llm-2/</guid><description>大模型基础的系列博客讲解，目的是以费曼学习法的方式让自己真正打牢大模型的基础</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一讲 &lt;a href=&quot;https://printsdf.dpdns.org/posts/llm-1/&quot;&gt;大模型 1/？&lt;/a&gt; 我们讲解了 Embedding，这是 AI 理解自然语言的基础。但是 Embedding 存在一个致命问题。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Embedding 的局限&lt;a href=&quot;#embedding-的局限&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Embedding 只解决了”词长什么样”，但没解决”词在当前句子里该怎么用”。&lt;/p&gt;&lt;p&gt;同一个 Token 在不同句子中，Embedding 是完全一样的，但语义却不同。&lt;/p&gt;&lt;p&gt;举个例子：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“他&lt;strong&gt;打&lt;/strong&gt;了个电话给我”&lt;/li&gt;
&lt;li&gt;“他&lt;strong&gt;打&lt;/strong&gt;了我一拳”&lt;/li&gt;
&lt;li&gt;“我们去&lt;strong&gt;打&lt;/strong&gt;球吧”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这三个”打”的 Embedding 完全相同，但在不同上下文中意思完全不同：打电话、打人、打球。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Tip&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;问题不是词义，而是上下文依赖。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Embedding 只解决了”词长什么样”，但没解决”词在当前句子里该怎么用”。&lt;/p&gt;&lt;p&gt;这就要引出大名鼎鼎的注意力机制了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Attention&lt;a href=&quot;#attention&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;Attention 要解决什么问题&lt;a href=&quot;#attention-要解决什么问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Attention（注意力机制）的目标不是生成新词，而是：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;让每个 Token 决定，在理解当前语义时，应该关注句子中的哪些 Token，以及关注多少。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;通过 Attention，同一个 Token 会因为上下文不同，得到完全不同的表示。这一步，语言才第一次变成”句子级理解”。&lt;/p&gt;&lt;p&gt;接下来我们一步步来解释它是如何做到的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Attention 的整体框架&lt;a href=&quot;#attention-的整体框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先，我们先把注意力机制当做一个黑盒，看看它的输入和输出：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/ml86f709-3483f9808c91.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入：&lt;/strong&gt; Attention 并没有引入新的输入，它仍然只基于 Embedding 得到的矩阵 &lt;span&gt;&lt;span&gt;XX&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt; 一个融合了上下文信息的新矩阵，代表每个 Token 在当前句子中的语义表示&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q / K / V 是什么&lt;a href=&quot;#q--k--v-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Attention 的计算需要三个东西：Q（Query）、K（Key）、V（Value）。&lt;/p&gt;&lt;p&gt;它们都是由同一个 Embedding 矩阵 &lt;span&gt;&lt;span&gt;XX&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 通过不同的线性变换得到的：&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Q=XWqK=XWkV=XWvQ = XW_q \\
K = XW_k \\
V = XW_v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;其中 &lt;span&gt;&lt;span&gt;Wq,Wk,WvW_q, W_k, W_v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是模型在训练过程中自动学习出来的参数，不需要我们自己定义。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;为什么不能直接用 X？&lt;a href=&quot;#为什么不能直接用-x&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;你可能会问：既然都是从 &lt;span&gt;&lt;span&gt;XX&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 来的，为什么不直接用 &lt;span&gt;&lt;span&gt;XXTXX^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 来计算相关性呢？&lt;/p&gt;&lt;p&gt;答案是：&lt;strong&gt;如果直接用&lt;/strong&gt; &lt;span&gt;&lt;span&gt;XXTXX^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;，会陷入”自恋”状态。&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;任何一个 Token 和自己的相似度一定是最大的（ &lt;span&gt;&lt;span&gt;X1⋅X1TX_1 \cdot X_1^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 最大）&lt;/li&gt;
&lt;li&gt;模型会过度关注自己，忽略上下文&lt;/li&gt;
&lt;li&gt;Attention 会退化成”什么都不看”&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;通过引入不同的 W_q 和 W_k，模型可以打破这种对称性，学会从其他 Token 中汲取更有用的信息。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q / K / V 的角色&lt;a href=&quot;#q--k--v-的角色&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有了这三个不同的表示，它们分别扮演什么角色呢？看着是不是很像查哈希表：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Q（Query）&lt;/strong&gt;：代表”我想找什么”，即当前 Token 的诉求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K（Key）&lt;/strong&gt;：代表”我有什么”，即每个 Token 能提供的标签&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V（Value）&lt;/strong&gt;：代表”我的具体内容是什么”，即每个 Token 携带的实际语义&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Attention 的计算流程&lt;a href=&quot;#attention-的计算流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Attention 的计算可以拆成三步：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;计算”我和谁相关”&lt;/strong&gt; —— &lt;span&gt;&lt;span&gt;QKTQK^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把相关性变成权重&lt;/strong&gt; —— &lt;span&gt;&lt;span&gt;softmax(QKTdk)softmax(\frac{QK^T}{\sqrt{d_k}})&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;so&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按权重汇总信息&lt;/strong&gt; —— 乘以 &lt;span&gt;&lt;span&gt;VV&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;完整的公式为：&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Attention=softmax(QKTdk)VAttention = softmax(\frac{QK^T}{\sqrt{d_k}})V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;tt&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;so&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;section&gt;&lt;h3&gt;第一步：计算相关性 &lt;span&gt;&lt;span&gt;QKTQK^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;#第一步计算相关性-qktqktqkt&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我们先以单个 Token 的视角来看： &lt;span&gt;&lt;span&gt;Q1⋅KkTQ_1 \cdot K_k^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;假设我们 Embedding 的维度为 &lt;span&gt;&lt;span&gt;dkd_k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，那么：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;X1X_1&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 为 &lt;span&gt;&lt;span&gt;(1,dk)(1, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Wq=Wk=(dk,dk)W_q = W_k = (d_k, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;最终 &lt;span&gt;&lt;span&gt;Q1Q_1&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 为 &lt;span&gt;&lt;span&gt;(1,dk)(1, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;， &lt;span&gt;&lt;span&gt;KkK_k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 为 &lt;span&gt;&lt;span&gt;(1,dk)(1, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;Q1⋅KkTQ_1 \cdot K_k^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 代表的就是当前 Token 想要寻找的信息与其他 Token 可提供信息的相关性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么用内积？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;向量内积如果值越大，说明两个向量的空间距离就越小。根据我们上一节 Embedding 学习到的知识，这其实也就说明两个 Token 的语义越接近。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：归一化为权重&lt;a href=&quot;#第二步归一化为权重&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;现在我们有了相关性分数，但这些分数的数值范围不确定，需要转换为”注意力权重”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么要除以&lt;/strong&gt; &lt;span&gt;&lt;span&gt;dk\sqrt{d_k}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;因为内积的数值会随着维度增大而增大，而 &lt;span&gt;&lt;span&gt;softmaxsoftmax&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;so&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 对数值尺度非常敏感。如果不缩放，容易出现非 0 即 1 的极端情况。&lt;/p&gt;&lt;p&gt;除以 &lt;span&gt;&lt;span&gt;dk\sqrt{d_k}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 可以让内积保持在合理范围内。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;softmax 做了什么？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;softmaxsoftmax&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;so&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 将相关性分数归一化到 0-1 之间，且所有权重之和为 1，形成一个概率分布。&lt;/p&gt;&lt;p&gt;经过 &lt;span&gt;&lt;span&gt;softmaxsoftmax&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;so&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 后， &lt;span&gt;&lt;span&gt;Q1Q_1&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 对每个 &lt;span&gt;&lt;span&gt;KkK_k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的分数就代表着 &lt;span&gt;&lt;span&gt;Token1Token_1&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 对 &lt;span&gt;&lt;span&gt;TokenkToken_k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的注意力权重。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：加权求和&lt;a href=&quot;#第三步加权求和&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最后，用注意力权重对每个 Token 的实际信息（ &lt;span&gt;&lt;span&gt;VV&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;）进行加权求和。&lt;/p&gt;&lt;p&gt;每个 Token 最终得到的表示 = 根据注意力权重，从所有 Token 的 &lt;span&gt;&lt;span&gt;VV&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 中汇总信息。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Tip&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;注意力机制的本质：
根据 Q 和 K 的匹配度，决定从对应的 V 中抽取多少信息&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;从 Token 到句子&lt;a href=&quot;#从-token-到句子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上面我们讲的是单个 Token 的计算过程。对于整个句子：&lt;/p&gt;&lt;p&gt;假设句子有 &lt;span&gt;&lt;span&gt;nn&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个 Token，那么：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;XX&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 为 &lt;span&gt;&lt;span&gt;(n,dk)(n, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Q,K,VQ, K, V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 都为 &lt;span&gt;&lt;span&gt;(n,dk)(n, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;QKTQK^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 shape 为 &lt;span&gt;&lt;span&gt;(n,n)(n, n)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; —— 这是一个注意力矩阵，第 &lt;span&gt;&lt;span&gt;ii&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 行第 &lt;span&gt;&lt;span&gt;jj&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 列表示第 &lt;span&gt;&lt;span&gt;ii&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个 Token 对第 &lt;span&gt;&lt;span&gt;jj&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个 Token 的注意力&lt;/li&gt;
&lt;li&gt;最终输出的 shape 为 &lt;span&gt;&lt;span&gt;(n,dk)(n, d_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; —— 每个 Token 都得到了融合上下文信息后的新表示&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过 Attention，我们解决了 Embedding 的局限：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Embedding 给了每个词一个固定的表示&lt;/li&gt;
&lt;li&gt;Attention 让每个词根据上下文动态调整表示&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;同一个 Token 在不同句子中，虽然 Embedding 相同，但经过 Attention 后会得到完全不同的表示。&lt;/p&gt;&lt;p&gt;这就是 Attention 的魔力所在。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>hf 空间不足</title><link>https://printsdf.dpdns.org/posts/2026-01-25t1731000000800-hf-%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/2026-01-25t1731000000800-hf-%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3/</guid><description>hf 空间不足</description><pubDate>Sun, 25 Jan 2026 09:31:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HF_DATASETS_CACHE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/tmp/hf_cache&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HF_HOME&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/tmp/hf_cache&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;将 &lt;code&gt;tmp&lt;/code&gt; 换为空闲路径即可&lt;/p&gt;</content:encoded></item><item><title>复习02</title><link>https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A002/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A002/</guid><description>复习02</description><pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;操作系统&lt;a href=&quot;#操作系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;并发和并行有什么区别？&lt;a href=&quot;#并发和并行有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;并发：多个事件在同一时间间隔内发生&lt;/li&gt;
&lt;li&gt;并行：多个事件在同一时刻同时发生&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;什么是异步、同步？&lt;a href=&quot;#什么是异步同步&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;同步：当前任务必须等待前一个任务完成后才能继续&lt;/li&gt;
&lt;li&gt;异步：任务无需等待，可并发执行&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;计算机网络&lt;a href=&quot;#计算机网络&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;解释C/S、B/S、P2P&lt;a href=&quot;#解释csbsp2p&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;C/S是指客户和服务器模式，是由客户发送请求，而服务器负责处理客户端发送的请求并返回响应&lt;/li&gt;
&lt;li&gt;B/S(Browse/Server)是C/S架构中的一种特殊的实现形式&lt;/li&gt;
&lt;li&gt;P2P是指网络中的每个节点都可以作为客户端和服务器，也是C/S的一种特殊形式&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;什么是DNS&lt;a href=&quot;#什么是dns&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;DNS全称是域名系统，用于将域名转换为IP地址&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>复习03</title><link>https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A003/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A003/</guid><description>复习03</description><pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;计算机网络&lt;a href=&quot;#计算机网络&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;简述DNS解析过程&lt;a href=&quot;#简述dns解析过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;浏览器先检查自身缓存、主机本地文件中有没有对应的记录，如果有直接返回结果&lt;/li&gt;
&lt;li&gt;向本地域名服务器发送域名解析请求，如果本地域名服务器缓存了该域名的IP地址，就直接返回&lt;/li&gt;
&lt;li&gt;否则就向根域名服务器发送解析请求，根域名服务器返回顶级域名服务器的IP地址&lt;/li&gt;
&lt;li&gt;本地域名服务器向TLD发送请求，顶级域名服务器返回权限域名服务器的IP地址&lt;/li&gt;
&lt;li&gt;本地域名服务器向权限域名服务器发送请求，权限域名服务器返回该域名对应的IP地址给本地域名服务器&lt;/li&gt;
&lt;li&gt;本地域名服务器将IP地址缓存，并且将其返回给应用层&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;什么是DHCP协议&lt;a href=&quot;#什么是dhcp协议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;DHCP协议是动态主机配置协议，用于为主机自动分配IP地址、子网掩码、默认网关等网络配置参数&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;操作系统&lt;a href=&quot;#操作系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;什么是内核态和用户态？为什么要分两个态？&lt;a href=&quot;#什么是内核态和用户态为什么要分两个态&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;内核态：操作系统拥有对系统硬件和资源的完全控制权，可以执行特权指令和访问受限资源&lt;/li&gt;
&lt;li&gt;用户态：应用程序只能执行受限的指令集，无法直接访问底层硬件和系统资源&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;用户态和内核态是如何切换的？&lt;a href=&quot;#用户态和内核态是如何切换的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;系统调用：用户态进程主动要求切换到内核态&lt;/li&gt;
&lt;li&gt;中断&lt;/li&gt;
&lt;li&gt;异常&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>复习04</title><link>https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A004/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A004/</guid><description>复习04</description><pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;操作系统&lt;a href=&quot;#操作系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;</content:encoded></item><item><title>复习00</title><link>https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A000/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A000/</guid><description>复习00</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;说一下TCP和UDP的区别&lt;a href=&quot;#说一下tcp和udp的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;TCP是可靠的连接协议，UDP是不可靠的连接协议&lt;/li&gt;
&lt;li&gt;TCP需要经过四握手三挥手才能建立连接，而UDP是尽最大努力交付&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;说一下线程和进程之间的区别&lt;a href=&quot;#说一下线程和进程之间的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;线程是进程的组成，一个进程中可以有多个线程&lt;/li&gt;
&lt;li&gt;进程是操作系统资源分配的基本单位，而线程是CPU调度的基本单位&lt;/li&gt;
&lt;li&gt;进程有自己独立的内存空间和系统资源，而线程与同一进程内的其他线程共享该进程的全部资源&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;说一下你知道的排序算法及其时间复杂度&lt;a href=&quot;#说一下你知道的排序算法及其时间复杂度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;冒泡排序，&lt;span&gt;&lt;span&gt;O(n2)O(n^2)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择排序，&lt;span&gt;&lt;span&gt;O(n2)O(n^2)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插入排序，&lt;span&gt;&lt;span&gt;O(n2)O(n^2)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合并排序，&lt;span&gt;&lt;span&gt;O(nlogn)O(nlogn)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快速排序，&lt;span&gt;&lt;span&gt;O(nlogn)O(nlogn)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，不稳定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;堆排序，&lt;span&gt;&lt;span&gt;(nlogn)(nlogn)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>复习01</title><link>https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A001/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%A4%8D%E4%B9%A001/</guid><description>复习01</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;操作系统&lt;a href=&quot;#操作系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;什么是操作系统？有什么特点？&lt;a href=&quot;#什么是操作系统有什么特点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;操作是一个运行在计算机上的软件程序，是管理和控制计算机系统软件和硬件资源的管理者。&lt;/li&gt;
&lt;li&gt;操作系统把一些硬件功能封装成简单易用的服务，使用户无需关注底层原理。&lt;/li&gt;
&lt;li&gt;特点：并发、共享、虚拟、异步&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;操作系统有哪些功能&lt;a href=&quot;#操作系统有哪些功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;处理机管理&lt;/li&gt;
&lt;li&gt;文件管理&lt;/li&gt;
&lt;li&gt;磁盘管理&lt;/li&gt;
&lt;li&gt;设备管理&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;计算机网络&lt;a href=&quot;#计算机网络&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;简述计算机网络的五层协议体系结构&lt;a href=&quot;#简述计算机网络的五层协议体系结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;五层协议体系结构从下往上分别是物理层、数据链路层、网络层、运输层、应用层。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;物理层：在连接各种计算机的传输媒体上传输数据比特流&lt;/li&gt;
&lt;li&gt;数据链路层：两台主机间传送数据，是在一段一段链路上传送的。数据链路层协议负责在相邻节点之间传输数据&lt;/li&gt;
&lt;li&gt;网络层：负责路由选择和转发，将传输层提供的数据包通过不同路径传输到目的地&lt;/li&gt;
&lt;li&gt;运输层：为进程间通信提供了通用（多种应用可以使用同一个运输服务）的数据传输服务。&lt;/li&gt;
&lt;li&gt;应用层：定义了应用进程之间通信和交互的规则&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;计算机网络为什么要分层？有什么优点？&lt;a href=&quot;#计算机网络为什么要分层有什么优点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;计算机网络是一个复杂的系统，分层可以将庞大复杂的问题转化成若干个较小的局部问题&lt;/li&gt;
&lt;li&gt;各层之间是独立的，不用关心其他层次的内容&lt;/li&gt;
&lt;li&gt;灵活性好，任何一层发生变化不影响上下层&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>数据挖掘期末指南</title><link>https://printsdf.dpdns.org/posts/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E6%9C%9F%E6%9C%AB%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E6%9C%9F%E6%9C%AB%E6%8C%87%E5%8D%97/</guid><description>数据挖掘期末指南</description><pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;数据挖掘复习指南&lt;a href=&quot;#数据挖掘复习指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;第一部分：概述与核心概念&lt;a href=&quot;#第一部分概述与核心概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 数据挖掘的定义与目标&lt;a href=&quot;#1-数据挖掘的定义与目标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本定义&lt;a href=&quot;#基本定义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据挖掘&lt;/strong&gt;：从大量数据中发现潜在的、有用的模式、信息、知识、规律和模型的过程&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;与KDD的关系&lt;a href=&quot;#与kdd的关系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;KDD是指从数据中发现有用知识的整个过程，而数据挖掘是特定算法的应用，用于从数据中提取模式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KDD（知识发现）&lt;/strong&gt;：数据挖掘是KDD过程中的一个关键步骤&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KDD是更广泛的概念，包括：数据选择、预处理、变换、数据挖掘和评估等&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;核心任务&lt;a href=&quot;#核心任务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;数据挖掘能做什么：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预测 (Prediction)&lt;/strong&gt;：通过分类或估值模型对未知变量进行预测&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分类 (Classification)&lt;/strong&gt;：输出离散类别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;估值/回归 (Estimation/Regression)&lt;/strong&gt;：输出连续值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;聚类 (Clustering)&lt;/strong&gt;：无监督分类，将数据对象分组，组内相似度高，组间相似度低&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联分析 (Association Analysis)&lt;/strong&gt;：发现数据项之间的关联规则（如购物篮分析）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;异常分析 (Anomaly Detection)&lt;/strong&gt;：识别数据中不寻常的模式或离群点&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;跨学科特性&lt;a href=&quot;#跨学科特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;相关领域&lt;/strong&gt;：机器学习、统计学、OLAP、专家系统、模式识别、数据库技术、人工智能、可视化技术、并行计算等&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据挖掘流程&lt;a href=&quot;#数据挖掘流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主要阶段&lt;/strong&gt;：数据预处理 → 特征提取 → 选择模型（模型训练）→ 评估与优化 → 测试&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第二部分：数据类型与属性&lt;a href=&quot;#第二部分数据类型与属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 属性与属性值&lt;a href=&quot;#1-属性与属性值&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本概念&lt;a href=&quot;#基本概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;属性 (Attribute)&lt;/strong&gt;：指数据的特征或维度
&lt;ul&gt;
&lt;li&gt;例如：身高、眼球颜色&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性值 (Attribute Value)&lt;/strong&gt;：该属性具体可取的量
&lt;ul&gt;
&lt;li&gt;例如：170cm、蓝色&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;重要区别&lt;a href=&quot;#重要区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;相同的属性可映射到不同值域&lt;/li&gt;
&lt;li&gt;不同属性可映射到同一组值，但性质不同
&lt;ul&gt;
&lt;li&gt;例如：ID无上限，年龄有最大最小值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 属性的类型 (Measurement Scale)&lt;a href=&quot;#2-属性的类型-measurement-scale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;标称属性 (Nominal Attribute)&lt;a href=&quot;#标称属性-nominal-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：值仅是不同名字，提供区分对象的信息（=, ≠），无序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：邮政编码、雇员ID号、眼球颜色、性别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用操作&lt;/strong&gt;：众数、熵、列联相关、χ² 检验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;序数属性 (Ordinal Attribute)&lt;a href=&quot;#序数属性-ordinal-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：值提供确定对象顺序的信息（&amp;lt;, &amp;gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：矿石硬度、{好，较好，最好}、成绩、街道号码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用操作&lt;/strong&gt;：中值、百分位、秩相关、游程检验、符号检验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;区间属性 (Interval Attribute)&lt;a href=&quot;#区间属性-interval-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：值之间的差有意义，存在测量单位（+, -），无绝对零点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：日历日期、摄氏或华氏温度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用操作&lt;/strong&gt;：均值、标准差、皮尔逊相关、t和F检验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;比率属性 (Ratio Attribute)&lt;a href=&quot;#比率属性-ratio-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：差和比率都有意义（*, /），有绝对零点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：绝对温度、货币量、计数、年龄、质量、长度、电流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用操作&lt;/strong&gt;：几何平均、调和平均、百分比变差&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;属性分类总结&lt;a href=&quot;#属性分类总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分类属性 (Qualitative)&lt;/strong&gt;：标称和序数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数值属性 (Quantitative)&lt;/strong&gt;：区间和比率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性值的性质&lt;/strong&gt;：相异性（=, ≠）、序（&amp;lt;, &amp;gt;）、加法（+, -）、乘法（*, /）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 离散与连续属性&lt;a href=&quot;#3-离散与连续属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;离散属性 (Discrete Attribute)&lt;a href=&quot;#离散属性-discrete-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：有限或无限可数个值，常表示为整数变量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特例&lt;/strong&gt;：二元属性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：邮政编码、计数、文档集的词&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;连续属性 (Continuous Attribute)&lt;a href=&quot;#连续属性-continuous-attribute&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：属性值为实数，一般用浮点变量表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：温度、高度、重量&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第三部分：数据集特性与类型&lt;a href=&quot;#第三部分数据集特性与类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 数据集的重要特性&lt;a href=&quot;#1-数据集的重要特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;维度相关特性&lt;a href=&quot;#维度相关特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;维度 (Dimensionality)&lt;/strong&gt;：数据集中对象具有的属性数目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维灾难 (Curse of Dimensionality)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;随着数据维度增加，数据在空间中越来越稀疏&lt;/li&gt;
&lt;li&gt;许多数据分析变得困难&lt;/li&gt;
&lt;li&gt;导致分类准确率降低，聚类质量下降&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;其他重要特性&lt;a href=&quot;#其他重要特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;稀疏性 (Sparsity)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;具有非对称特征的数据集&lt;/li&gt;
&lt;li&gt;一个对象的大部分属性上的值都为0&lt;/li&gt;
&lt;li&gt;只存储和处理非零值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分辨率 (Resolution)&lt;/strong&gt;：模式依赖于度量尺度&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 数据集类型&lt;a href=&quot;#2-数据集类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;记录数据 (Record Data)&lt;a href=&quot;#记录数据-record-data&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据矩阵 (Data Matrix)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对象具有相同的固定数值属性集&lt;/li&gt;
&lt;li&gt;表示为 m×n 矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文档数据 (Document Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个文档视为一个向量&lt;/li&gt;
&lt;li&gt;值是对应术语出现次数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事务数据 (Transaction Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每条记录（事务）涉及一组项目&lt;/li&gt;
&lt;li&gt;例如：购物清单&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;有序数据 (Ordered Data)&lt;a href=&quot;#有序数据-ordered-data&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;时间序列数据 (Time Series Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一段时间的测量序列&lt;/li&gt;
&lt;li&gt;具有时间自相关性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;空间数据 (Spatial Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具有空间属性&lt;/li&gt;
&lt;li&gt;具有空间自相关性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;序列数据 (Sequential Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时间次序重要但具体时间不重要&lt;/li&gt;
&lt;li&gt;例如：基因序列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;基于图的数据 (Graph-based Data)&lt;a href=&quot;#基于图的数据-graph-based-data&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：对象之间有联系或对象具有结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：分子结构&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第四部分：数据质量与预处理&lt;a href=&quot;#第四部分数据质量与预处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 数据质量问题&lt;a href=&quot;#1-数据质量问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;常见数据质量问题&lt;a href=&quot;#常见数据质量问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;离群点 (Outliers)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;与数据集中其他大部分数据对象特征不同的对象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;遗漏值 (Missing Values)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;信息未收集全或属性不适用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理策略&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;删除数据对象&lt;/li&gt;
&lt;li&gt;估计遗漏值&lt;/li&gt;
&lt;li&gt;分析时忽略&lt;/li&gt;
&lt;li&gt;用所有可能值替换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不一致值&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;矛盾或不匹配的值（如邮政编码与城市不符）&lt;/li&gt;
&lt;li&gt;纠正需附加信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重复数据 (Duplicate Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;冗余或几乎冗余的数据对象&lt;/li&gt;
&lt;li&gt;合并异构数据源时的主要问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据质量问题的根源&lt;a href=&quot;#数据质量问题的根源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测量误差和数据收集错误&lt;/strong&gt;：导致数据质量问题&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据清理 (Data Cleaning)&lt;a href=&quot;#数据清理-data-cleaning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主要任务&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;格式标准化&lt;/li&gt;
&lt;li&gt;异常数据清除&lt;/li&gt;
&lt;li&gt;错误纠正&lt;/li&gt;
&lt;li&gt;重复数据清除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;应用层面的问题&lt;a href=&quot;#应用层面的问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时效性 (Timeliness)&lt;/strong&gt;：数据过时导致模型过时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相关性 (Relevance)&lt;/strong&gt;：数据必须包含应用所需信息&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 数据预处理方法&lt;a href=&quot;#2-数据预处理方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;聚集 (Aggregation)&lt;a href=&quot;#聚集-aggregation&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：组合属性或对象&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：数据规约、范围转换、数据更稳定&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;抽样 (Sampling)&lt;a href=&quot;#抽样-sampling&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：选择数据对象子集，目的在于数据规约&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本原则&lt;/strong&gt;：代表性（保留原数据集性质）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抽样方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;简单随机抽样（无放回、有放回）&lt;/li&gt;
&lt;li&gt;分层抽样（按个数或比例）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样本大小&lt;/strong&gt;：足够大才能保留数据集结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐进抽样 (Progressive Sampling)&lt;/strong&gt;：从小样本开始，逐渐增加容量直到模型准确率稳定&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;维归约 (Dimensionality Reduction)&lt;a href=&quot;#维归约-dimensionality-reduction&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：减少属性数目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;避免维度灾难&lt;/li&gt;
&lt;li&gt;降低算法开销&lt;/li&gt;
&lt;li&gt;便于可视化&lt;/li&gt;
&lt;li&gt;减少不相关特征或噪音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要技术&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主成分分析 (PCA)&lt;/strong&gt;：找到原有属性线性组合，相互正交，捕获最大变差&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奇异值分解 (SVD)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;特征子集选择 (Feature Subset Selection)&lt;a href=&quot;#特征子集选择-feature-subset-selection&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：识别并移除不相关或冗余特征&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征类型&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;冗余特征&lt;/strong&gt;：重复信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不相关特征&lt;/strong&gt;：对任务无用的信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;嵌入方法&lt;/strong&gt;：结合数据挖掘算法（如决策树）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤方法&lt;/strong&gt;：独立于算法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包装方法&lt;/strong&gt;：算法作为黑盒评估性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;穷举方法&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;特征构造 (Feature Creation)&lt;a href=&quot;#特征构造-feature-creation&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：创建更能体现对象本质的新特征&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法类型&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特征提取&lt;/strong&gt;：领域相关或映射到新空间（如傅里叶变换、小波变换）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征构造&lt;/strong&gt;：一个或多个原始特征构造新特征（如密度=质量/体积）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;离散化与二元化 (Discretization and Binarization)&lt;a href=&quot;#离散化与二元化-discretization-and-binarization&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;减少属性值个数&lt;/li&gt;
&lt;li&gt;便于挖掘&lt;/li&gt;
&lt;li&gt;产生概念分层结构&lt;/li&gt;
&lt;li&gt;适应算法要求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离散化类型&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非监督离散化&lt;/strong&gt;：不使用类信息
&lt;ul&gt;
&lt;li&gt;等宽、等频、K-均值离散化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监督离散化&lt;/strong&gt;：使用类信息
&lt;ul&gt;
&lt;li&gt;基于熵的方法：极大化区间纯度（最小化熵）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二元化方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;映射到整数再二进制化（不适合非对称属性）&lt;/li&gt;
&lt;li&gt;对每个值建立二元变量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;属性变换 (Attribute Transformation)&lt;a href=&quot;#属性变换-attribute-transformation&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：将属性值集映射到新值集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变换类型&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;简单变换&lt;/strong&gt;：x^k, log(x), e^x, |x|, 1/x 等函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标准化/规范化&lt;/strong&gt;：使值集具有特定性质（如均值0，标准差1）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第五部分：相似性和相异性的度量&lt;a href=&quot;#第五部分相似性和相异性的度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 基本概念&lt;a href=&quot;#1-基本概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;核心定义&lt;a href=&quot;#核心定义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;相似性 (Similarity)&lt;/strong&gt;：数值度量相似程度，值越高越相似&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相异性 (Dissimilarity)&lt;/strong&gt;：数值度量差异程度，值越低越相似，最小为0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邻近性 (Proximity)&lt;/strong&gt;：指相似或不同之处&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 距离度量&lt;a href=&quot;#2-距离度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;欧氏距离 (Euclidean Distance)&lt;a href=&quot;#欧氏距离-euclidean-distance&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：两点之间直线距离，最常见&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;code&gt;d(x,y) = √(Σ(xₖ - yₖ)²)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;闵可夫斯基距离 (Minkowski Distance)&lt;a href=&quot;#闵可夫斯基距离-minkowski-distance&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：欧氏距离的推广&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特殊情况&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r=1&lt;/code&gt;：城市街区距离 (Manhattan, L1范数)，如汉明距离&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r=2&lt;/code&gt;：欧氏距离&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r→∞&lt;/code&gt;：上确界距离 (L∞范数)，最大差异&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;距离的性质 (度量 Metric)&lt;a href=&quot;#距离的性质-度量-metric&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;非负性&lt;/strong&gt;：&lt;code&gt;d(x,y) ≥ 0&lt;/code&gt;，且 &lt;code&gt;d(x,y)=0&lt;/code&gt; 当且仅当 &lt;code&gt;x=y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对称性&lt;/strong&gt;：&lt;code&gt;d(x,y) = d(y,x)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三角不等式&lt;/strong&gt;：&lt;code&gt;d(x,z) ≤ d(x,y) + d(y,z)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;非度量的相异度&lt;a href=&quot;#非度量的相异度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;不满足一个或多个度量性质（如集合差、时间）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 数据对象间的相似度&lt;a href=&quot;#3-数据对象间的相似度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;常用相似度度量&lt;a href=&quot;#常用相似度度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简单匹配系数 (SMC)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;匹配属性个数 / 总属性个数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jaccard系数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不涉及0-0匹配的属性个数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;余弦相似度 (Cosine Similarity)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;衡量向量方向的相似性&lt;/li&gt;
&lt;li&gt;公式：&lt;code&gt;cos(x,y) = (x·y) / (||x|| × ||y||)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相关性 (Correlation)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对象属性之间线性联系的度量&lt;/li&gt;
&lt;li&gt;范围：-1到1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 邻近度计算的实际问题&lt;a href=&quot;#4-邻近度计算的实际问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;主要挑战&lt;a href=&quot;#主要挑战&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标准化和相关性&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;属性值域不同时需变换到相同值域&lt;/li&gt;
&lt;li&gt;属性相关时使用Mahalanobis距离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;组合异种属性的相似度&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对不同类型属性分别计算并加权求和&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;属性权重问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用权值加权的相似度或闵可夫斯基距离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第六部分：分类算法&lt;a href=&quot;#第六部分分类算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 分类模型评估基础&lt;a href=&quot;#1-分类模型评估基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;混淆矩阵 (Confusion Matrix)&lt;a href=&quot;#混淆矩阵-confusion-matrix&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：总结分类模型性能的表格&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本概念&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TP (True Positive)&lt;/strong&gt;：真正例，实际为正预测为正&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FN (False Negative)&lt;/strong&gt;：假反例，实际为正预测为负&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FP (False Positive)&lt;/strong&gt;：假正例，实际为负预测为正&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TN (True Negative)&lt;/strong&gt;：真反例，实际为负预测为负&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;评估指标&lt;a href=&quot;#评估指标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准确率 (Accuracy)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式：&lt;code&gt;(TP + TN) / (TP + FN + FP + TN)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;局限性：类别不平衡时可能误导&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;其他重要度量&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;真正率 (TPR) / 灵敏度 (Sensitivity)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真负率 (TNR) / 特异度 (Specificity)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;假正率 (FPR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;假负率 (FNR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;召回率 (Recall)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精度 (Precision)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F1度量&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ROC曲线&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：绘制TPR vs FPR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：评估分类器性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AUC&lt;/strong&gt;：曲线下面积，重要指标&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. K-近邻分类 (K-Nearest Neighbors, KNN)&lt;a href=&quot;#2-k-近邻分类-k-nearest-neighbors-knn&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本原理&lt;a href=&quot;#基本原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：记录x的K近邻是与x距离最近的k个数据点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判断过程&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;计算已知样本与未知样本的距离&lt;/li&gt;
&lt;li&gt;找到k个最近样本&lt;/li&gt;
&lt;li&gt;通过多数表决（或距离加权表决）确定类别&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;K值选择的影响&lt;a href=&quot;#k值选择的影响&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;K太小&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;对噪声敏感&lt;/li&gt;
&lt;li&gt;模型复杂&lt;/li&gt;
&lt;li&gt;易过拟合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K太大&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;邻域可能包含其他类点&lt;/li&gt;
&lt;li&gt;模型简单&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;算法特点&lt;a href=&quot;#算法特点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;基于实例的学习（惰性学习）&lt;/li&gt;
&lt;li&gt;非参数估计&lt;/li&gt;
&lt;li&gt;生成任意形状的决策边界&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;需要邻近性度量&lt;/li&gt;
&lt;li&gt;分类开销大&lt;/li&gt;
&lt;li&gt;无显式学习过程&lt;/li&gt;
&lt;li&gt;需要数据预处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 贝叶斯分类器&lt;a href=&quot;#3-贝叶斯分类器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;贝叶斯定理&lt;a href=&quot;#贝叶斯定理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;code&gt;P(Y=yⱼ|X) = P(X|Y=yⱼ)P(Y=yⱼ) / P(X)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MAP (最大后验假设)&lt;/strong&gt;：将X指派到具有最大后验概率P(yⱼ|X)的类yⱼ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先验概率P(yⱼ)&lt;/strong&gt;：由训练集中类yⱼ的样本数nⱼ与总样本数n的比值nⱼ/n估计&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;朴素贝叶斯分类器 (NBC)&lt;a href=&quot;#朴素贝叶斯分类器-nbc&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心假设&lt;/strong&gt;：条件独立假设
&lt;ul&gt;
&lt;li&gt;给定样本的类标号，假定属性值条件地相互独立&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率估计&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;P(X|Y=yⱼ) = ∏P(xᵢ|yⱼ)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;离散属性：用频率估计&lt;/li&gt;
&lt;li&gt;连续属性：假设服从高斯分布&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;NBC的优缺点&lt;a href=&quot;#nbc的优缺点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;对孤立噪声点有鲁棒性&lt;/li&gt;
&lt;li&gt;能处理属性值缺失&lt;/li&gt;
&lt;li&gt;对无关属性有鲁棒性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;条件独立假设可能不成立&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;贝叶斯信念网络 (BBN)&lt;a href=&quot;#贝叶斯信念网络-bbn&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改进&lt;/strong&gt;：允许在变量子集间定义类条件独立性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构&lt;/strong&gt;：因果关系图模型
&lt;ul&gt;
&lt;li&gt;节点表示随机变量&lt;/li&gt;
&lt;li&gt;边表示依赖关系&lt;/li&gt;
&lt;li&gt;图中无环&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;用图形模型捕获先验知识&lt;/li&gt;
&lt;li&gt;编码因果依赖关系&lt;/li&gt;
&lt;li&gt;构造费时但添加新变量容易&lt;/li&gt;
&lt;li&gt;适合处理不完整数据&lt;/li&gt;
&lt;li&gt;对过拟合鲁棒&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 决策树分类器&lt;a href=&quot;#4-决策树分类器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本原理&lt;a href=&quot;#基本原理-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;算法特性&lt;/strong&gt;：贪心算法，自上而下分而治之，递归分割&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性选择&lt;/strong&gt;：基于启发式或统计度量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;停止条件&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;节点数据都属同一类别&lt;/li&gt;
&lt;li&gt;没有属性可再用于分割&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;不纯性度量 (Impurity Measure)&lt;a href=&quot;#不纯性度量-impurity-measure&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：衡量节点内数据类别分布的均匀性（越均匀越不纯）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要度量&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;熵 (Entropy)&lt;/strong&gt;：衡量系统无序程度，熵越大越无序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基尼系数 (Gini Index)&lt;/strong&gt;：衡量随机抽取两样本类别不一致的概率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分类误差 (Classification Error)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;划分增益&lt;a href=&quot;#划分增益&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：衡量划分后不纯度的降低，增益越大越有利于分类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要指标&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信息增益 (Information Gain)&lt;/strong&gt;：当不纯度用熵度量时的增益&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增益率 (Gain Ratio)&lt;/strong&gt;：解决熵和基尼系数倾向于多值属性的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;最佳划分策略&lt;a href=&quot;#最佳划分策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;过程&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;对每个属性确定最佳划分（不纯度最低）&lt;/li&gt;
&lt;li&gt;选择增益最大的属性&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续属性处理&lt;/strong&gt;：排序后取相邻不同类值中点作为划分点&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;决策树特点&lt;a href=&quot;#决策树特点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本性质&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非参数方法&lt;/li&gt;
&lt;li&gt;贪心算法&lt;/li&gt;
&lt;li&gt;NP完全问题&lt;/li&gt;
&lt;li&gt;决策边界是直线（平面），平行于坐标轴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速建立模型和分类&lt;/li&gt;
&lt;li&gt;分类准确率高&lt;/li&gt;
&lt;li&gt;适合固定属性记录数据&lt;/li&gt;
&lt;li&gt;相对容易解释&lt;/li&gt;
&lt;li&gt;对噪声鲁棒&lt;/li&gt;
&lt;li&gt;可避免过拟合&lt;/li&gt;
&lt;li&gt;自动选择最好属性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据碎片问题&lt;/li&gt;
&lt;li&gt;子树可能重复&lt;/li&gt;
&lt;li&gt;平行于坐标轴的边界限制能力&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 模型的过拟合与剪枝&lt;a href=&quot;#5-模型的过拟合与剪枝&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;误差类型&lt;a href=&quot;#误差类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;训练误差 (Training Error)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型在训练集上的误分类比例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;泛化误差 (Generalization Error)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型在未知记录上的期望误差&lt;/li&gt;
&lt;li&gt;通常在检验集上估计&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;拟合问题&lt;a href=&quot;#拟合问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;欠拟合 (Underfitting)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练和检验误差都很大&lt;/li&gt;
&lt;li&gt;原因：模型假设空间太小或偏离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;过拟合 (Overfitting)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练误差小，但检验误差大&lt;/li&gt;
&lt;li&gt;原因：模型过度拟合训练数据，巨大的模型假设空间与稀疏数据矛盾&lt;/li&gt;
&lt;li&gt;具体原因：噪声、缺乏代表性样本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;剪枝 (Pruning)&lt;a href=&quot;#剪枝-pruning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：降低决策树复杂度，解决过拟合&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h5&gt;评估方法&lt;a href=&quot;#评估方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在训练集上估计&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练误差结合模型复杂度&lt;/li&gt;
&lt;li&gt;悲观误差评估&lt;/li&gt;
&lt;li&gt;最小描述长度(MDL)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用确认集 (Validation Set)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将训练数据分为训练子集和确认集&lt;/li&gt;
&lt;li&gt;确认集用于估计泛化误差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;剪枝策略&lt;a href=&quot;#剪枝策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预剪枝 (Pre-pruning)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提前停止树的构造&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后剪枝 (Post-pruning)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先构造完整的树&lt;/li&gt;
&lt;li&gt;再剪掉不必要的分支&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 分类模型评估方法&lt;a href=&quot;#6-分类模型评估方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本评估方法&lt;a href=&quot;#基本评估方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保持 (Holdout) 方法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;划分：2/3训练，1/3检验&lt;/li&gt;
&lt;li&gt;局限性：训练样本少，模型高度依赖数据集构成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;随机二次抽样 (Random Subsampling)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重复保持方法k次，取平均准确率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;交叉验证 (Cross-validation)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;K折交叉验证&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;数据集划分为k个不相交子集&lt;/li&gt;
&lt;li&gt;k-1份训练，1份测试，重复k次&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;留一法 (Leave-one-out)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;k=n，每个样本单独作为测试集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;统计评估&lt;a href=&quot;#统计评估&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准确率的置信区间&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供区间估计，衡量测量结果的可信程度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型性能比较&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过比较误差率的差值是否统计显著&lt;/li&gt;
&lt;li&gt;使用t-分布计算置信区间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. 集成学习 (Ensemble Learning)&lt;a href=&quot;#7-集成学习-ensemble-learning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本思想&lt;a href=&quot;#基本思想&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;聚集多个分类器的预测以提高分类准确率&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;主要算法&lt;a href=&quot;#主要算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaboost&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;迭代训练基分类器&lt;/li&gt;
&lt;li&gt;每次调整训练样本权重&lt;/li&gt;
&lt;li&gt;对误分类样本赋予更高权重&lt;/li&gt;
&lt;li&gt;后续分类器更关注这些样本&lt;/li&gt;
&lt;li&gt;最终通过基分类器的加权投票产生预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;随机森林 (Random Forest)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多棵CART树的组合&lt;/li&gt;
&lt;li&gt;每棵树的训练集有放回采样&lt;/li&gt;
&lt;li&gt;训练节点时特征随机无放回抽取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rotation Forest&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用整个训练集建立多个基分类器&lt;/li&gt;
&lt;li&gt;通过不同特征变换将数据变换到不同新特征空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;特殊问题处理&lt;a href=&quot;#特殊问题处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代价敏感学习 (Cost-sensitive Learning)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;考虑不同类型错误（如漏报、假警告）的代价&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不平衡数据问题 (Imbalanced Data)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基于抽样&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;欠抽样 (Undersampling)：可能丢失有用样本&lt;/li&gt;
&lt;li&gt;过抽样 (Oversampling)：可能导致过拟合噪声样本&lt;/li&gt;
&lt;li&gt;组合方法：Undersampling + Oversampling&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两阶段学习&lt;/strong&gt;：分阶段学习规则，如PN-Rules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第七部分：聚类分析 (无监督学习)&lt;a href=&quot;#第七部分聚类分析-无监督学习&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 聚类概述&lt;a href=&quot;#1-聚类概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;学习类型对比&lt;a href=&quot;#学习类型对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;有监督学习&lt;/strong&gt;：有标记，学习假设函数确定决策分界&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无监督学习&lt;/strong&gt;：无标记，算法对同一类的进行划分&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;基本概念&lt;a href=&quot;#基本概念-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;簇 (Cluster)&lt;/strong&gt;：一个数据对象的集合，簇内对象相似性高，簇间相异性高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;聚类分析&lt;/strong&gt;：将给定数据对象集合分成不同的簇，是一种无监督分类法&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;好的聚类方法标准&lt;a href=&quot;#好的聚类方法标准&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;高质量聚类结果（高簇内相似性、低簇间相似性）&lt;/li&gt;
&lt;li&gt;能发现隐含模式&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;聚类算法要求&lt;a href=&quot;#聚类算法要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;可伸缩性&lt;/li&gt;
&lt;li&gt;发现任意形状簇&lt;/li&gt;
&lt;li&gt;无需特定领域知识确定输入参数&lt;/li&gt;
&lt;li&gt;处理噪声和异常&lt;/li&gt;
&lt;li&gt;对输入数据顺序不敏感&lt;/li&gt;
&lt;li&gt;处理高维数据&lt;/li&gt;
&lt;li&gt;产生满足用户约束的可解释结果&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;聚类类型&lt;a href=&quot;#聚类类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;按结构分类&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;划分聚类 (Partitioning Clustering)&lt;/strong&gt;：数据对象划分为不重叠的k个簇&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;层次聚类 (Hierarchical Clustering)&lt;/strong&gt;：簇具有子簇&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;按覆盖方式分类&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;互斥、重叠与模糊&lt;/li&gt;
&lt;li&gt;完全聚类、部分聚类&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 主要聚类方法分类&lt;a href=&quot;#2-主要聚类方法分类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;按算法原理分类&lt;a href=&quot;#按算法原理分类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;划分算法&lt;/strong&gt;：构建数据的k个划分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;层次算法&lt;/strong&gt;：对数据对象集合进行层次分解&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于密度算法&lt;/strong&gt;：基于连通性和密度函数聚类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于网格算法&lt;/strong&gt;：对象空间量化为网格，操作在网格中进行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于模型算法&lt;/strong&gt;：为每个簇假定一个模型&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 划分聚类算法&lt;a href=&quot;#3-划分聚类算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;K-均值 (K-means)&lt;a href=&quot;#k-均值-k-means&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地位&lt;/strong&gt;：最广泛使用的聚类算法&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h5&gt;算法流程&lt;a href=&quot;#算法流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;随机选择k个初始簇中心&lt;/li&gt;
&lt;li&gt;将每个对象赋给最近的簇&lt;/li&gt;
&lt;li&gt;重新计算每个簇的平均值&lt;/li&gt;
&lt;li&gt;重复直到准则函数收敛&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;优缺点分析&lt;a href=&quot;#优缺点分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简单、快速&lt;/li&gt;
&lt;li&gt;对大数据集可伸缩&lt;/li&gt;
&lt;li&gt;高效，当簇密集时效果好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需事先给定k&lt;/li&gt;
&lt;li&gt;对初值敏感&lt;/li&gt;
&lt;li&gt;不适合非凸面或大小差别很大的簇&lt;/li&gt;
&lt;li&gt;对噪声和孤立点敏感&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;算法变形&lt;a href=&quot;#算法变形&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改进方向&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;初始K个平均值的选择&lt;/li&gt;
&lt;li&gt;相异度计算&lt;/li&gt;
&lt;li&gt;簇均值策略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理分类属性&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;K-modes&lt;/li&gt;
&lt;li&gt;K-原型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;K-中心点 (K-medoids) / PAM&lt;a href=&quot;#k-中心点-k-medoids--pam&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：每个簇用接近聚类中心的一个中心点表示&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 层次聚类方法&lt;a href=&quot;#4-层次聚类方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;基本定义&lt;a href=&quot;#基本定义-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;对给定数据集进行层次分解&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;层次聚类类型&lt;a href=&quot;#层次聚类类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;凝聚的层次聚类 (AGNES)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;策略&lt;/strong&gt;：自底向上，每个对象一个簇，逐步合并&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;合并处理不能撤销，可能导致低质量聚类&lt;/li&gt;
&lt;li&gt;可伸缩性差，复杂度高O(n²)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分裂的层次聚类 (DIANA)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;策略&lt;/strong&gt;：自顶向下，所有对象一个簇，逐渐细分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;簇间距离度量方法&lt;a href=&quot;#簇间距离度量方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最小距离 (Single Linkage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大距离 (Complete Linkage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均值距离 (Centroid Linkage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均距离 (Average Linkage)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 基于密度的方法 (DBSCAN)&lt;a href=&quot;#5-基于密度的方法-dbscan&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;核心概念&lt;a href=&quot;#核心概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;距离函数&lt;/strong&gt;：度量样本点间关系&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Epsilon (ε)&lt;/strong&gt;：距离阈值，定义邻域&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;minPoints&lt;/strong&gt;：邻域内的最小样本数&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;样本分类&lt;a href=&quot;#样本分类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心样本 (Core Point)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ε邻域内样本数 ≥ minPoints&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;边界样本 (Border Points)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ε邻域内样本数 &amp;lt; minPoints&lt;/li&gt;
&lt;li&gt;且在某个核心样本的邻域内&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;噪声样本 (Noise Points)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不属于任何核心样本的邻域&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;密度连接概念&lt;a href=&quot;#密度连接概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;密度直达&lt;/strong&gt;：样本X在核心样本Y的邻域内&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密度可达&lt;/strong&gt;：通过一系列核心样本的密度直达关系连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密度相连&lt;/strong&gt;：两个样本X和Y都可以从同一个核心样本O密度可达&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;聚类过程&lt;a href=&quot;#聚类过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;随机寻找核心样本点&lt;/li&gt;
&lt;li&gt;推导其密度相连的点&lt;/li&gt;
&lt;li&gt;赋予簇编号&lt;/li&gt;
&lt;li&gt;重复直到所有核心样本点都有对应类别&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;DBSCAN优缺点&lt;a href=&quot;#dbscan优缺点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能发现K-means不能发现的任意形状簇&lt;/li&gt;
&lt;li&gt;对噪声有鲁棒性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对高维数据处理能力不足&lt;/li&gt;
&lt;li&gt;簇密度变化较大时有问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第八部分：关联分析&lt;a href=&quot;#第八部分关联分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 基本概念&lt;a href=&quot;#1-基本概念-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;核心定义&lt;a href=&quot;#核心定义-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关联规则 (Association Rules)&lt;/strong&gt;：发现数据项之间有趣的关联关系，形如 X → Y&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频繁项集 (Frequent Itemsets)&lt;/strong&gt;：出现频率（支持度）高于最小支持度阈值的项集&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;重要度量&lt;a href=&quot;#重要度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;支持度 (Support)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项集在总事务中出现的百分比&lt;/li&gt;
&lt;li&gt;衡量项集的普遍性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;置信度 (Confidence)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关联规则 X → Y 的置信度：&lt;code&gt;P(Y|X) = Support(X∪Y) / Support(X)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;衡量规则的可靠性或强度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;规则产生&lt;a href=&quot;#规则产生&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;从频繁项集中提取关联规则&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Apriori算法&lt;a href=&quot;#2-apriori算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;核心思想&lt;a href=&quot;#核心思想&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逐层算法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从频繁1-项集到最长的频繁项集&lt;/li&gt;
&lt;li&gt;每次遍历项集格中的一层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;产生-测试策略&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产生新的候选项集&lt;/li&gt;
&lt;li&gt;对每个候选的支持度进行计数和比较&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;Apriori性质 (先验原理)&lt;a href=&quot;#apriori性质-先验原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;正向性质&lt;/strong&gt;：如果一个项集是频繁的，它的所有非空子集也必须是频繁的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反单调性&lt;/strong&gt;：如果一个项集是非频繁的，则它的所有超集也一定是非频繁的&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;算法步骤&lt;a href=&quot;#算法步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;候选项集的产生与剪枝&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从频繁(k-1)-项集通过自连接产生k-项集&lt;/li&gt;
&lt;li&gt;利用Apriori性质剪掉非频繁候选项集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;支持度计数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确定每个候选项集出现的频繁程度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;规则产生&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;忽略前件或后件为空的规则&lt;/li&gt;
&lt;li&gt;每个频繁k-项集能产生多达 2^k-2 个关联规则&lt;/li&gt;
&lt;li&gt;利用置信度的反单调性进行剪枝：
&lt;ul&gt;
&lt;li&gt;如果规则 X → Y-X 不满足置信度阈值&lt;/li&gt;
&lt;li&gt;则形如 X’ → Y-X’ 的规则（其中 X’ 是 X 的子集）也一定不满足置信度阈值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;本指南涵盖了数据挖掘的核心概念和主要算法，从数据预处理到具体的挖掘技术，为期末复习提供了系统性的知识框架。重点掌握各算法的原理、优缺点和适用场景，理解评估方法和实际应用中的问题处理策略。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>数据挖掘算法总结</title><link>https://printsdf.dpdns.org/posts/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93/</guid><description>数据挖掘算法总结</description><pubDate>Fri, 13 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;1. 决策树归纳算法 (Decision Tree Induction Algorithm)&lt;a href=&quot;#1-决策树归纳算法-decision-tree-induction-algorithm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; 决策树归纳算法是一种贪心算法，采用自顶向下递归的方式构建决策树。它在每一步选择最优的属性来划分数据集，直到满足预设的停止条件（例如，节点中的所有样本都属于同一类别，或没有可用于划分的属性）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Generate_decision_tree(数据集 E, 属性集 F):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 创建结点N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;结点 N = createNode()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 检查停止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 E 中所有记录都属于同一个类 C:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;N.label = C  // 标记为叶结点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 F 为空 (没有更多属性可用于划分):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;N.label = E 中最常见的类 (多数表决) // 标记为叶结点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 选择最佳划分属性和条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root.test_cond = find_best_split(E, F) // 寻找能够最大化增益（或最小化不纯度）的最佳划分属性和条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;标记结点 N 为 root.test_cond&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 根据划分条件递归构建子树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 root.test_cond 的每个可能输出值 v:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Ev = {e | root.test_cond(e) == v 并且 e 属于 E} // 获取满足条件v的子集&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;创建从 N 到 child 的分支，标记为 v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 Ev 为空:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;child = createNode()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;child.label = E 中最常见的类 (多数表决) // 为空子集添加默认叶结点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;否则:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;child = Generate_decision_tree(Ev, F - {root.test_cond.attribute}) // 递归调用，移除已用属性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 child 作为 N 的派生结点添加到树中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;2. k-近邻分类算法 (k-Nearest Neighbor Classification Algorithm)&lt;a href=&quot;#2-k-近邻分类算法-k-nearest-neighbor-classification-algorithm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; k-NN是一种惰性学习算法（Lazy Learner），它不预先构建显式模型。对于一个未知测试样本，它通过计算与训练集中所有样本的距离，找出距离最近的 k 个邻居，然后根据这些邻居的类别进行多数表决（或距离加权表决）来决定测试样本的类别。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 k_Nearest_Neighbor_Classify(训练集 D, 测试样本 z=(x&apos;, y&apos;), 参数 k):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 计算测试样本 z 与训练集中每个样本的距离&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 D 中的每个训练样本 (x_i, y_i):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;计算 z 的特征向量 x&apos; 和 x_i 之间的距离 d(x&apos;, x_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 找出 k 个距离最近的训练样本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 D 中的样本按距离 d(x&apos;, x_i) 升序排序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;选择距离 z 最近的 k 个训练样本，构成集合 Dz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 根据 k 个邻居的类别进行多数表决&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y_prime_predicted = argmax_v (∑ (i 属于 Dz) I(v == y_i)) // I 是指示函数，v 是类别标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 另一种常见的表决方式是距离加权表决：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// y_prime_predicted = argmax_v (∑ (i 属于 Dz) (1/d(x&apos;, x_i)) * I(v == y_i))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 y_prime_predicted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;3. 后向传播算法 (Backpropagation Algorithm for Artificial Neural Network)&lt;a href=&quot;#3-后向传播算法-backpropagation-algorithm-for-artificial-neural-network&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; 后向传播是训练多层前馈神经网络的迭代算法。它通过两个主要阶段：向前传播输入以计算输出，然后向后传播误差。根据计算出的误差，算法会调整网络中的连接权重和偏置，以最小化网络的预测误差。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Backpropagation(训练数据集 D, 学习率 l, 神经网络 Network):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 初始化权重和偏置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 Network 中所有权重和偏置初始化为小的随机数 (例如，介于 -1.0 到 1.0 之间)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 迭代训练直到满足终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;当 终止条件不满足 时: // 终止条件可以是最大迭代次数、误差低于阈值等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 D 中的每个训练元组 X (输入) 及其真实输出 T:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2.1 向前传播输入 (计算各层的净输入和输出)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 每个输入层单元 j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Oj = Ij // 输入单元的输出等于其输入值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 隐藏层和输出层每个单元 j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;净输入 Ij = ∑ (i 来自上一层) (w_ij * Oi) + θj // w_ij 是权重，Oi 是上一层单元i的输出，θj 是偏置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;输出 Oj = 1 / (1 + e^(-Ij)) // 使用 Logistic 激活函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2.2 后向传播误差 (从输出层开始向后计算误差)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 输出层每个单元 j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Err_j = Oj * (1 - Oj) * (Tj - Oj) // Tj 是单元j的真实输出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 从最后一个到第一个隐藏层，对于隐藏层每个单元 j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Err_j = Oj * (1 - Oj) * ∑ (k 来自下一较高层) (w_kj * Err_k) // w_kj 是单元j到下一层单元k的权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2.3 更新权重和偏置 (根据计算出的误差调整网络参数)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 Network 中每个权重 w_ij (从单元 i 到单元 j):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Δw_ij = l * Err_j * Oi // 权值增量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_ij = w_ij + Δw_ij // 权值更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 Network 中每个偏置 θj:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Δθj = l * Err_j // 偏置增量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;θj = θj + Δθj // 偏置更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回 训练后的神经网络 Network&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;4. Bagging 算法&lt;a href=&quot;#4-bagging-算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; Bagging (自助聚集) 是一种集成学习（Ensemble Learning）方法。它通过有放回抽样从原始训练集生成多个自助训练集，然后在每个自助集上独立地训练一个基分类器（通常是同类型的弱学习器）。最终分类时，所有基分类器对测试样本进行投票（分类问题为多数投票，回归问题为平均），选择得票最高的类别。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Bagging_Train(原始训练集 D, 基分类器算法 A, 基分类器数量 M):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分类器集合 C = {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 i 从 1 到 M:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 从 D 中有放回地随机抽样，生成与 D 容量相同的子集 D_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// (此过程称为自助抽样)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;D_i = Bootstrap_Sample(D)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 在自助抽样数据集 D_i 上训练基分类器 C_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C_i = A.train(D_i) // 使用算法 A 在数据集 D_i 上训练分类器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 C_i 添加到 C&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 分类器集合 C&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Bagging_Classify(分类器集合 C, 测试样本 x):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;类别预测计数 = 一个空字典 (用于存储每个类别的票数)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 C 中的每个分类器 C_i:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;预测类别 p = C_i.predict(x) // 获取当前基分类器的预测结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;增加 p 在类别预测计数中的票数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 类别预测计数中票数最高的类别&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;5. Boosting 算法 (通用框架)&lt;a href=&quot;#5-boosting-算法-通用框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; Boosting 是一种迭代的集成学习方法。它为每个训练样本赋予权重，并迭代地训练一系列基分类器。每次训练时，后续的基分类器会“更关注”前一个分类器误分类的样本（通过调整样本权重实现）。最终分类时，基分类器根据其在训练中的表现（通常是其准确率的函数）进行加权投票。Adaboost 是其一个流行实现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Boosting_Train(训练集 D, 基分类器算法 A, 迭代次数 K):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;N = D 的样本总数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;初始化 D 中每个训练记录的权重 w_j = 1/N (j = 1 to N)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分类器集合 C = []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;重要性权重集合 Alpha = [] // 存储每个基分类器的权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 i 从 1 到 K:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 根据当前样本权重 w_j，训练基分类器 C_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// (算法 A 在训练时会考虑样本权重)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C_i = A.train(D, w_j)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 计算分类器 C_i 的分类误差 ε_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ε_i = ∑ (j = 1 to N) w_j * I(C_i(x_j) != y_j) // I 是指示函数，当预测错误时为 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 计算分类器 C_i 的重要性 α_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;α_i = 0.5 * ln((1 - ε_i) / ε_i) // 示例公式，具体可能因算法而异&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 更新训练样本的权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 j 从 1 到 N:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 C_i(x_j) 误分类了样本 j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = w_j * e^(α_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;否则 (C_i 正确分类了样本 j):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = w_j * e^(-α_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;规范化权重 w_j，使其总和为 1 (∑w_j = 1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;添加 C_i 到 C&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;添加 α_i 到 Alpha&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 (分类器集合 C, 重要性权重集合 Alpha)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Boosting_Classify(分类器集合 C, 重要性权重集合 Alpha, 测试样本 x):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;最终预测票数 = 一个空字典 (存储每个类别的加权票数)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 C 中的每个分类器 C_i (对应的重要性权重 α_i):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;预测类别 p = C_i.predict(x)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 α_i 加到 p 的最终预测票数中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 最终预测票数中票数最高的类别&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;6. Adaboost 算法&lt;a href=&quot;#6-adaboost-算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; Adaboost (Adaptive Boosting) 是 Boosting 算法的一个具体且流行的实现。它通过迭代训练一系列弱分类器，在每次迭代中，会增加前一轮被错误分类样本的权重，减少被正确分类样本的权重，使得后续的弱分类器更关注“困难”的样本。最终，通过加权多数投票的方式组合所有弱分类器，其中每个弱分类器的投票权重由其在训练中的错误率决定。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Adaboost_Train(训练集 D = {(x_j, y_j)}, 基分类器算法 A, 迭代次数 K):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;N = D 的样本总数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;初始化每个训练样本的权重 w_j = 1/N (j = 1 to N)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;弱分类器集合 H = [] // 存储弱分类器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;弱分类器重要性权重集合 Alpha = [] // 存储每个弱分类器的权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 i 从 1 到 K:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 使用当前样本权重 w_j 训练弱分类器 h_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// (这里假设算法 A 能处理带权重的样本)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;h_i = A.train(D, w_j)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 计算弱分类器 h_i 的分类误差 ε_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ε_i = ∑ (j = 1 to N) w_j * I(h_i(x_j) != y_j) // I 是指示函数，当预测错误时为 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 检查误差，如果误差过大（大于 0.5），则视为无效学习，重新初始化权重并继续&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 ε_i &amp;gt; 0.5:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = 1/N (j = 1 to N) // 重置权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;继续下一次迭代 (跳过当前迭代的剩余步骤)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 计算弱分类器 h_i 的重要性权重 α_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;α_i = 0.5 * ln((1 - ε_i) / ε_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 5. 更新样本权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 j 从 1 到 N:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 h_i(x_j) != y_j: // 如果分类错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = w_j * e^(α_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;否则: // 如果分类正确&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = w_j * e^(-α_i)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 规范化权重 w_j，使其总和为 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_sum = ∑ (j = 1 to N) w_j&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 j 从 1 到 N:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;w_j = w_j / w_sum&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;添加 h_i 到 H&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;添加 α_i 到 Alpha&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 (弱分类器集合 H, 弱分类器重要性权重集合 Alpha)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Adaboost_Classify(H, Alpha, 测试样本 x):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;最终预测投票 = {} // 存储每个类别的加权票数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 k 从 1 到 H.size():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;预测类别 p = H[k].predict(x) // 获取第 k 个弱分类器的预测结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 Alpha[k] (第 k 个弱分类器的权重) 加到 最终预测投票[p] 中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 最终预测投票中票数最高的类别&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;7. k-means 算法&lt;a href=&quot;#7-k-means-算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; k-means 是一种迭代的划分聚类算法，旨在将 n 个数据对象划分为 k 个簇。它通过最小化平方误差准则（即每个簇内数据点到其簇中心的距离之和）来优化簇的划分。算法会反复调整簇的成员关系和簇中心，直到收敛。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 k_means_Cluster(数据集 D, 簇数目 k):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 初始化：任意选择 k 个对象作为初始的簇中心 (平均值)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;随机选择 D 中的 k 个点作为初始均值 (μ_1, μ_2, ..., μ_k)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;重复:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 簇分类 (分配步骤)：将每个对象分配到距离最近的簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;创建 k 个空簇 C_1, C_2, ..., C_k&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 D 中的每个对象 x_j:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;找到距离 x_j 最近的簇中心 μ_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 x_j 分配到簇 C_i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 更新簇平均值 (更新步骤)：重新计算每个簇的平均值作为新的簇中心&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;所有簇中心都设置为 null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 每个簇 C_i (i = 1 to k):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;μ_i_new = C_i 中所有对象的平均值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 检查收敛条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 所有簇中心 μ_i 不再明显地变化 (例如，新旧中心距离小于阈值)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 或 准则函数 E 不再明显地变化 (平方误差和)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// E = ∑ (i=1 to k) ∑ (x 属于 C_i) ||x - μ_i_new||^2:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;跳出循环&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;否则:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;μ_i = μ_i_new // 更新簇中心为新计算的值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 k 个最终簇 C_1, C_2, ..., C_k&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;8. AGNES 算法 (层次凝聚聚类)&lt;a href=&quot;#8-agnes-算法-层次凝聚聚类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; AGNES (AGglomerative NESting) 是一种自底向上的层次聚类算法。它开始时将每个数据对象视为一个单独的簇，然后迭代地合并最相似的两个簇，直到达到预定义的簇数量。簇之间的相似度通常由它们之间最近的数据点对的距离确定（即“最小距离”准则）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 AGNES_Cluster(数据集 D, 终止簇数目 k):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 初始化：将每个对象当成一个初始簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;簇集合 Clusters = { {o} | o 属于 D } // 每个对象都是一个单例簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;重复:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 检查终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 Clusters 中的簇数目 == k:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;跳出循环&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 找到当前簇集合中距离最近的两个簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;min_distance = 无穷大&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;closest_cluster_1 = null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;closest_cluster_2 = null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 Clusters 中的每对不同簇 (C_a, C_b):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 计算 C_a 和 C_b 之间的距离 (例如，使用最小距离：两簇间最近点的距离)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;distance_ab = min(dist(p, q)) for p in C_a, q in C_b&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 distance_ab &amp;lt; min_distance:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;min_distance = distance_ab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;closest_cluster_1 = C_a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;closest_cluster_2 = C_b&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 合并最近的两个簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;从 Clusters 中移除 closest_cluster_1 和 closest_cluster_2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 (closest_cluster_1 U closest_cluster_2) 添加到 Clusters // 合并后的新簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 最终的簇集合 Clusters&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;9. DIANA 算法 (层次分裂聚类)&lt;a href=&quot;#9-diana-算法-层次分裂聚类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; DIANA (Divisive ANAlysis) 是一种自顶向下的层次聚类算法。它开始时将所有对象放在一个簇中，然后迭代地将当前簇中“最不相似”（通常是直径最大或平均相异度最大的）的簇分裂成两个子簇，直到达到预定义的簇数量。分裂过程通常涉及识别簇中最“离群”的点作为新簇的种子。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 DIANA_Cluster(数据集 D, 终止簇数目 k):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 初始化：将所有对象整个当成一个初始簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;簇集合 Clusters = { D }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 i 从 1 到 k-1: // 需要进行 k-1 次分裂才能得到 k 个簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 在所有当前簇中挑出具有最大直径（或平均相异度最大）的簇 C_to_split&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C_to_split = Clusters 中直径最大的簇 // 或者其他“最不紧凑”的度量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 在 C_to_split 中找出与其它点平均相异度最大的一个点 p&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// (此点将被作为分裂的起点，形成新的分裂组)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;p = C_to_split 中平均相异度最大的点 // p 称为 splinter_group 的初始点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;splinter_group = {p}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;old_party = C_to_split - {p}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;重复:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;has_moved = 假&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 将 old_party 中满足条件（更接近 splinter_group）的点移入 splinter_group&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 old_party 中的每个点 q:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dist_to_splinter = q 到 splinter_group 中点的最小距离&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dist_to_old_party = q 到 old_party 中点的最小距离&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 dist_to_splinter &amp;lt;= dist_to_old_party:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 q 从 old_party 移到 splinter_group&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;has_moved = 真&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;直到 not has_moved // 没有点再被移动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 5. 更新簇集合：移除被分裂的簇，加入新形成的两个子簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;从 Clusters 中移除 C_to_split&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 splinter_group 和 old_party 添加到 Clusters&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 最终的簇集合 Clusters&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;10. DBSCAN 算法&lt;a href=&quot;#10-dbscan-算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的聚类算法。它能够发现任意形状的簇，并且对噪声数据具有鲁棒性。DBSCAN 通过定义核心点、边界点和噪声点的概念，从核心点开始，将所有密度可达的点连接成簇。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;伪代码 (根据概念描述综合，非直接源于PPT中的伪代码):&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 DBSCAN_Cluster(数据集 D, 邻域半径 Eps, 最小点数 MinPts):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;簇标签 C = 一个映射，存储每个点所属的簇ID，初始为 未访问 (UNVISITED)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;簇ID = 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 D 中的每个点 P:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 C[P] != UNVISITED:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;继续下一个点 (P 已经被处理过)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[P] = VISITED // 标记为已访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Neighbors = 获取 P 的 Eps-邻域内的所有点 // 包含 P 自身&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 Neighbors.size() &amp;lt; MinPts:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[P] = NOISE // 标记为噪声点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;否则:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;簇ID = 簇ID + 1 // 发现一个新的簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;扩展簇(P, Neighbors, 簇ID, Eps, MinPts, D, C)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 簇标签 C (每个点所属的簇ID或噪声标记)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 扩展簇(P_core, Neighbors, current_cluster_ID, Eps, MinPts, D, C):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[P_core] = current_cluster_ID // 将核心点 P_core 分配到当前簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;队列 Q = new Queue()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 Neighbors 中的所有点添加到 Q&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;当 Q 不为空时:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CurrentP = Q.dequeue() // 从队列中取出一个点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 C[CurrentP] == NOISE:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[CurrentP] = current_cluster_ID // 将噪声点重新分配为边界点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 C[CurrentP] == UNVISITED: // 如果点未被访问过&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[CurrentP] = VISITED // 标记为已访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CurrentP_Neighbors = 获取 CurrentP 的 Eps-邻域内的所有点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 CurrentP_Neighbors.size() &amp;gt;= MinPts: // CurrentP 是新的核心点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 CurrentP_Neighbors 中的每个点 N_neighbor:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 C[N_neighbor] == UNVISITED 或者 C[N_neighbor] == NOISE:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Q.enqueue(N_neighbor) // 将未访问或噪声点加入队列，以便后续处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C[CurrentP] = current_cluster_ID // 将 CurrentP 分配到当前簇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;11. Apriori 算法 (频繁项集产生和规则产生)&lt;a href=&quot;#11-apriori-算法-频繁项集产生和规则产生&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;说明:&lt;/strong&gt; Apriori 算法是经典的关联规则挖掘算法，分为两个主要阶段：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;频繁项集产生:&lt;/strong&gt; 发现所有满足最小支持度阈值 (minsup) 的项集。它利用“先验原理”（任何非频繁项集的超集一定也是非频繁的）来有效剪枝搜索空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规则产生:&lt;/strong&gt; 从所有发现的频繁项集中，提取满足最小置信度阈值 (minconf) 的关联规则。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;伪代码:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Apriori_Frequent_Itemset_Generation(事务数据集 T, 最小支持度 minsup):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 1. 发现频繁 1-项集 (F1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C1 = D 中所有唯一的项 (1-项集) 组成的集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;F1 = {c 属于 C1 | c.support_count / |T| &amp;gt;= minsup} // 计算支持度并筛选&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;频繁项集总集合 Frequent_Itemsets = F1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;k = 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;重复:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;k = k + 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 2. 候选项集产生 (Apriori-gen): 从 F(k-1) 生成 Ck&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// (此步骤会合并 F(k-1) 中的项集，并进行剪枝：如果一个 k-项集的任何 k-1 子集不在 F(k-1) 中，则该 k-项集不是频繁的)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Ck = Apriori_candidate_generation(Fk-1)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 3. 计算候选项集 Ck 的支持度计数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 T 中的每个事务 t:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 Ck 中的每个候选项集 c:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 c 包含在 t 中:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;c.support_count++&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 4. 从 Ck 中筛选出频繁项集 Fk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Fk = {c 属于 Ck | c.support_count / |T| &amp;gt;= minsup}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将 Fk 中的所有项集添加到 Frequent_Itemsets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;直到 Fk 为空 (没有新的频繁 k-项集产生)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 Frequent_Itemsets // 所有频繁项集的集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;函数 Apriori_Rule_Generation(频繁项集 Frequent_Itemsets, 最小置信度 minconf):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;强关联规则集合 Rules = {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 Frequent_Itemsets 中的每个频繁项集 itemset (其长度 &amp;gt;= 2):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 对于 itemset 的每个非空真子集 antecedent:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 后件 consequent = itemset - antecedent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 剪枝原则：如果规则 X -&amp;gt; Y 的置信度不满足，那么任何 X&apos; 包含 X 的规则 X&apos; -&amp;gt; Y 的置信度也不会满足。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// （这允许我们从后件最少的情况开始生成规则，并根据置信度进行剪枝）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 此处伪代码简化为直接遍历所有可能的 Antecedent 和 Consequent 组合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;对于 itemset 的每个非空真子集 antecedent:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;consequent = itemset - antecedent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 consequent 为空:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;继续下一个子集 (后件不能是空集)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;confidence = itemset.support_count / antecedent.support_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;如果 confidence &amp;gt;= minconf:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;将规则 (antecedent -&amp;gt; consequent) 添加到 Rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回 Rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>第八章 维护</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E5%85%AB%E7%AB%A0-%E7%BB%B4%E6%8A%A4/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E5%85%AB%E7%AB%A0-%E7%BB%B4%E6%8A%A4/</guid><description>第八章 维护</description><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h4&gt;&lt;strong&gt;1. 维护的定义与持续时间&lt;/strong&gt;&lt;a href=&quot;#1-维护的定义与持续时间&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：软件维护是指软件在&lt;strong&gt;交付使用之后&lt;/strong&gt;，为了&lt;strong&gt;改正错误&lt;/strong&gt;或&lt;strong&gt;满足新的需要&lt;/strong&gt;而修改软件的过程。这包括修复错误（bug）或增加新功能（如游戏更新、App更新）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续时间&lt;/strong&gt;：维护是软件开发过程中&lt;strong&gt;持续时间最长&lt;/strong&gt;的阶段。它的时间定义是从软件交付之日到该软件最终被废弃为止。即使软件没有进行维护活动，但只要还在使用，就属于维护阶段。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;&lt;strong&gt;2. 维护的四种类型&lt;/strong&gt;&lt;a href=&quot;#2-维护的四种类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;维护活动可以分为四种类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改正性维护 (Corrective Maintenance / 改错性维护)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：诊断和改正错误的过程。主要是修改bug。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：比较常见。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适应性维护 (Adaptive Maintenance)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：为了&lt;strong&gt;和变化的环境适当配合&lt;/strong&gt;而修改软件的过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：是必要且经常的维护活动。例如，当硬件发展较快，软件需要更新以适配新硬件时。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完善性维护 (Perfective Maintenance)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：用户在使用软件过程中，提出&lt;strong&gt;增加新功能&lt;/strong&gt;、&lt;strong&gt;修改已有功能&lt;/strong&gt;或&lt;strong&gt;一般性改进建议&lt;/strong&gt;而进行的维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：通常占&lt;strong&gt;维护活动的大部分比重&lt;/strong&gt;。主要是增加或增强功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预防性维护 (Preventive Maintenance)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：为了&lt;strong&gt;改进未来的可维护性、可靠性&lt;/strong&gt;，或为未来的改进&lt;strong&gt;奠定更好的基础&lt;/strong&gt;而修改软件时进行的维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：目前所占比重较少。例如，在预定维护日期前整理文档资料或修改不适应的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;四类维护所占大致比重&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完善性维护&lt;/strong&gt;：55% 至 66%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改正性维护&lt;/strong&gt;：约 20%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适应性维护&lt;/strong&gt;：约 20%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预防性维护&lt;/strong&gt;：约 4%&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;&lt;strong&gt;3. 软件维护的特点&lt;/strong&gt;&lt;a href=&quot;#3-软件维护的特点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结构化维护与非结构化维护差别巨大&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非结构化维护&lt;/strong&gt;：软件配置成分&lt;strong&gt;只有程序代码&lt;/strong&gt;，文档、数据等缺失。这种软件维护起来非常困难，因为第一步就是难以读懂。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化维护&lt;/strong&gt;：存在&lt;strong&gt;完整的软件配置&lt;/strong&gt;，从设计阶段开始的文档、图文资料都齐全。这种软件相对容易读懂和维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要区别&lt;/strong&gt;在于&lt;strong&gt;文档&lt;/strong&gt;是否齐全。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;维护的代价高昂&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;金钱代价&lt;/strong&gt;：最明显的体现在&lt;strong&gt;维护费用&lt;/strong&gt;上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无形代价&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;耽误甚至丧失开发的良机&lt;/strong&gt;：可用资源必须供给维护使用，可能需要抽调正在开发新项目的人员去做维护，从而耽误新项目的开发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引起用户不满&lt;/strong&gt;：当看起来合理的改错和修改要求不能及时满足时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低软件质量&lt;/strong&gt;：维护时的改动可能在软件中引入&lt;strong&gt;潜伏的错误&lt;/strong&gt;。为避免这种情况，需要进行&lt;strong&gt;回归测试&lt;/strong&gt;以防止非预期的副作用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;造成开发过程混乱&lt;/strong&gt;：软件工程师被突然调去从事维护工作，会造成工作交接和断档问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;维护问题很多&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：绝大多数问题都归因于&lt;strong&gt;软件定义和软件开发方法的缺点&lt;/strong&gt;。通常是因为开发定义阶段没做好或文档资料不全。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;具体问题&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解别人写的代码非常困难&lt;/strong&gt;：尤其当软件配置成分减少（如仅有程序代码没有说明文档）时，困难程度迅速增加。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件缺乏合格的文档&lt;/strong&gt;或文档资料显著不足。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不能指望开发人员仔细说明&lt;/strong&gt;：软件寿命长，原开发人员可能已离职或记不住细节。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绝大多数软件在设计时没有考虑将来的修改&lt;/strong&gt;：导致将来增加功能或扩充困难。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件维护不是一项吸引人的工作&lt;/strong&gt;：因为维护工作可能很困难，需要反复论证和验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;&lt;strong&gt;4. 软件维护过程&lt;/strong&gt;&lt;a href=&quot;#4-软件维护过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;维护过程本质上是修改和压缩的软件定义和开发阶段。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;建立维护组织&lt;/strong&gt;：通常不会成立专门的正式维护组织，而是指派原开发人员进行维护工作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确定维护报告和评价过程&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;软件问题报告表&lt;/strong&gt;：由&lt;strong&gt;用户&lt;/strong&gt;提交，类似于报修流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维护要求表&lt;/strong&gt;：由&lt;strong&gt;维护人员&lt;/strong&gt;编写，给出软件修改报告的必要信息，如所需工作量、维护性质和优先次序等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为每个维护规定一个标准化的事件流&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一步&lt;/strong&gt;：&lt;strong&gt;确定要进行维护的类型&lt;/strong&gt;（改错、改进或适应性维护）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;若是改错型&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;估算严重程度&lt;/strong&gt;（优先级）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严重问题&lt;/strong&gt;：立即开始工作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不严重问题&lt;/strong&gt;：写入修正计划，等待统一修改。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;若是改进或适应性&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;进行&lt;strong&gt;优先度评价&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严重的&lt;/strong&gt;：立即开始做。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低的&lt;/strong&gt;：放到开发目录，等待统一修改。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后&lt;/strong&gt;：进行复审。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立用于维护的保存过程和规定复审标准&lt;/strong&gt;：收集每项维护工作的数据，如完成日期、开始日期、使用人员等，可构建数据库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评价维护活动&lt;/strong&gt;：至少从七个方面对维护进行评价，包括每类维护活动的人员总数等。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;&lt;strong&gt;5. 软件的可维护性&lt;/strong&gt;&lt;a href=&quot;#5-软件的可维护性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：维护人员&lt;strong&gt;理解、改动、改进、改正&lt;/strong&gt;软件的难易程度。也可指扩充和压缩的难易程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决定软件可维护性的因素（及提高方法）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可理解性 (Understandability)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：外来读者理解软件结构、功能、接口和内部处理过程的难易程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高方法&lt;/strong&gt;：&lt;strong&gt;模块化&lt;/strong&gt;、&lt;strong&gt;详细的文档&lt;/strong&gt;、结构化设计、程序的内部文档和良好的高级程序设计语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可测试性 (Testability)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：诊断和测试的容易程度，取决于软件的可理解程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关系&lt;/strong&gt;：&lt;strong&gt;可理解性与可测试性相互促进&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高方法&lt;/strong&gt;：良好的文档、合理的软件结构、好用的测试工具和调试工具，以及良好的测试过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可修改性 (Modifiability)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;影响因素&lt;/strong&gt;：&lt;strong&gt;耦合、内聚&lt;/strong&gt;、信息隐蔽、局部化、控制与作用力的关系等。强调&lt;strong&gt;模块独立性&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可移植性 (Portability)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：把程序从一个计算环境转移到另一个计算环境的难易程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高方法&lt;/strong&gt;：将因环境变化而必须修改的程序&lt;strong&gt;局限在少数模块中&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可重用性 (Reusability)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：同一个事物不做修改或稍加修改，在不同环境中多次重复使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;益处&lt;/strong&gt;：大量使用重用构件可以提高可维护性，因为重用构件经过多次验证且节省人力。例如：类、类库。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档 (Documentation)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;决定因素&lt;/strong&gt;：文档是影响软件可维护性的&lt;strong&gt;决定因素&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两类文档&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户文档&lt;/strong&gt;：主要描述系统功能和使用方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统文档&lt;/strong&gt;：如软件可行性报告、需求规格说明书等用户不关心但开发人员需要的资料。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;&lt;strong&gt;6. 预防性维护的方法：软件再工程 (Software Re-engineering)&lt;/strong&gt;&lt;a href=&quot;#6-预防性维护的方法软件再工程-software-re-engineering&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;软件再工程是预防性维护的一种方法。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预防性维护的几种做法&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;反复多次尝试修改&lt;/strong&gt;程序，与源代码“顽强战斗” (不推荐)。&lt;/li&gt;
&lt;li&gt;通过仔细分析程序员，尽可能多地掌握内部细节以有效修改。&lt;/li&gt;
&lt;li&gt;在深入理解原有设计的基础上，用软件工程方法&lt;strong&gt;重新设计、编码、测试&lt;/strong&gt;那些需要变更的部分 (部分再工程)。&lt;/li&gt;
&lt;li&gt;使用软件工具和方法学为指导，对程序进行&lt;strong&gt;全部重新设计、编码和测试&lt;/strong&gt; (完整再工程，使用CASE工具等)。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;软件再工程的工作内容&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;库存目录分析 (Inventory Analysis)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;分析应用系统的基本信息（如年份、用户量、规模、修改次数、业务重要程度等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;识别预防性维护（再工程）的对象&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;预定要使用很多年的程序。&lt;/li&gt;
&lt;li&gt;当前正在成功使用的系统/程序。&lt;/li&gt;
&lt;li&gt;近期内具有重大修改或增强的程序。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档重构 (Document Restructuring)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;老程序固有特点是文档资料缺失。文档重构非常耗时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;策略&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保持现状&lt;/strong&gt;：如果软件即将废弃，没必要重构文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部分重构&lt;/strong&gt;：只针对系统当前正在修改的部分建立文档，随时间推移逐渐攒齐。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整重构&lt;/strong&gt;：针对业务关键系统，仍然需设法压缩工作量进行全面文档重构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逆向工程 (Reverse Engineering)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：分析程序，以便在比源代码更高的抽象层次上创建程序的某种表示过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：&lt;strong&gt;恢复设计结果&lt;/strong&gt;。工具从现有程序中抽取有关数据、体系结构和处理过程的设计信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码重构 (Code Restructuring)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：最常见的再工程活动。适用于体系结构完整但个体编码方式较差的老程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做法&lt;/strong&gt;：用重构工具分析源代码，标注违背结构化程序概念的部分，重构有问题代码，复审测试重构代码并更新文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据重构 (Data Re-engineering)&lt;/strong&gt;：发生在较低抽象层次上的全范围再工程活动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正向工程 (Forward Engineering) / 革新或改造 (Renovation or Re-adaptation)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：不仅从现有程序中恢复设计信息，而且用该信息去改编或重构现有系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：提高整体质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>第七章 实现</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%83%E7%AB%A0-%E5%AE%9E%E7%8E%B0/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%83%E7%AB%A0-%E5%AE%9E%E7%8E%B0/</guid><description>第七章 实现</description><pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;第七章“实现”主要包含&lt;strong&gt;编码工作&lt;/strong&gt;和&lt;strong&gt;测试&lt;/strong&gt;两大部分内容。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h4&gt;7.1 编码 (Coding)&lt;a href=&quot;#71-编码-coding&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：将软件设计结果翻译成某种程序设计语言，书写程序。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7.1.1 选择程序设计语言&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;语言分类：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;汇编语言 (Assembly Language)&lt;/strong&gt;：将软件设计翻译成机器操作序列，表示方式不同，既困难又容易出错。&lt;/li&gt;
&lt;li&gt;高级语言 (High-Level Language)：如 Java, C#, C++, C, Python, MATLAB 等。
&lt;ul&gt;
&lt;li&gt;优势：
&lt;ul&gt;
&lt;li&gt;一句对应多句，&lt;strong&gt;效率更高&lt;/strong&gt;（实现相同功能代码量更少）。&lt;/li&gt;
&lt;li&gt;允许用户给程序变量或子程序赋予&lt;strong&gt;含义鲜明的名字&lt;/strong&gt;，便于多人协作理解。&lt;/li&gt;
&lt;li&gt;使用的符号和概念&lt;strong&gt;符合人的习惯思维&lt;/strong&gt; (如 if-else, =, +)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;书写、阅读、测试、调试和维护更容易&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用现状&lt;/strong&gt;：绝大多数情况下使用高级语言，极特别领域使用汇编语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;语言选择标准 (7个)：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;系统用户的要求&lt;/strong&gt;：用户可能指定特定语言以方便内部维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可使用的编译程序&lt;/strong&gt;：目标环境提供的编译程序限制语言范围。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可得到的软件工具&lt;/strong&gt;：方便的软件工具利于编写和验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程的规模&lt;/strong&gt;：有些语言更适合大型程序开发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序员的知识&lt;/strong&gt;：程序员是否熟练掌握该语言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可一致性要求&lt;/strong&gt;：软件是否需分布到不同计算机上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用领域&lt;/strong&gt;：不同领域对语言有使用限制。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;7.1.2 编码风格 (Coding Style)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：编写程序时表现出的特点、习惯和逻辑思路。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;良好风格的养成&lt;/p&gt;
&lt;p&gt;(5个方面)：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;程序的内部文档：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;恰当的标识符&lt;/strong&gt; (含义鲜明的名字)：帮助阅读者理解程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适当的注解&lt;/strong&gt; (注释)：程序员之间及对未来自己的重要通信手段，有助于程序理解。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;程序的视觉组织 (代码排版)：
&lt;ul&gt;
&lt;li&gt;对程序可读性有很大影响。&lt;/li&gt;
&lt;li&gt;应利用&lt;strong&gt;适当的阶梯形式&lt;/strong&gt;来表示层次结构 (如 if-then-else 的缩进)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;数据说明：
&lt;ul&gt;
&lt;li&gt;次序应&lt;strong&gt;标准化&lt;/strong&gt; (按类型或数据结构)。&lt;/li&gt;
&lt;li&gt;多个变量名在同一语句说明时，应按&lt;strong&gt;字母顺序排列&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;复杂数据结构应&lt;strong&gt;注释说明&lt;/strong&gt;其实现方法和特点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;语句构造：
&lt;ul&gt;
&lt;li&gt;每个语句应&lt;strong&gt;清晰而简单&lt;/strong&gt;，不应为提高效率使程序过分复杂。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;效率：
&lt;ul&gt;
&lt;li&gt;指&lt;strong&gt;处理机时间&lt;/strong&gt;和&lt;strong&gt;存储容量&lt;/strong&gt;两方面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率是性能要求&lt;/strong&gt;，应在需求分析阶段明确。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;好的设计提高效率&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;程序的效率和程序的&lt;strong&gt;简单程度应一致&lt;/strong&gt;，不应牺牲清晰性和可读性不必要地提高效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;7.2 测试基础 (Testing Basics)&lt;a href=&quot;#72-测试基础-testing-basics&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;7.2.1 测试阶段的根本目标&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;尽可能多地发现并排除&lt;/strong&gt;软件中潜藏的错误。&lt;/li&gt;
&lt;li&gt;最终把一个高质量的软件交给用户使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强调&lt;/strong&gt;：软件测试&lt;strong&gt;不可能排除所有的错误&lt;/strong&gt;，因为技术和测试用例限制。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;7.2.2 软件测试的目标 (定义)&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;测试是为了&lt;strong&gt;发现程序中错误&lt;/strong&gt;而执行的过程。&lt;/li&gt;
&lt;li&gt;好的测试方案是&lt;strong&gt;尽可能发现迄今为止尚未发现错误&lt;/strong&gt;的测试方案。&lt;/li&gt;
&lt;li&gt;成功的测试是&lt;strong&gt;发现了迄今为止尚未发现错误&lt;/strong&gt;的测试。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;7.2.3 测试准则&lt;/strong&gt; (7个)&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;所有测试都应追溯到用户需求&lt;/strong&gt;：不符合需求是最严重的错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远在测试开始之前就应制定测试计划&lt;/strong&gt; (在设计阶段制定)。&lt;/li&gt;
&lt;li&gt;应将&lt;strong&gt;二八原则&lt;/strong&gt; (Pareto principle) 应用到软件测试中。&lt;/li&gt;
&lt;li&gt;应&lt;strong&gt;从小规模测试开始，逐步进行大规模测试&lt;/strong&gt; (如从单元测试到验收测试)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;穷举测试是不可能的&lt;/strong&gt;：软件路径众多，测试用例无法穷尽，因此需要逻辑覆盖等方法。&lt;/li&gt;
&lt;li&gt;为达到最佳测试效果，应有&lt;strong&gt;独立的第三方进行测试工作&lt;/strong&gt; (测试人员与代码编写人员分开)。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;7.2.4 测试方法&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;黑盒测试 (Black-box Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：把程序看作一个&lt;strong&gt;黑盒子&lt;/strong&gt;，&lt;strong&gt;完全不考虑程序内部结构和处理过程&lt;/strong&gt;，只在程序的接口进行测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检查内容&lt;/strong&gt;：程序功能是否按规格说明书正常使用，能否接收数据并产生正确输出，运行中是否保持外部信息完整性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别称&lt;/strong&gt;：&lt;strong&gt;功能测试&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理解&lt;/strong&gt;：只关心&lt;strong&gt;结果是否正确&lt;/strong&gt;，不关心过程 (类比数学题，结果对过程错，黑盒老师判对)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用阶段&lt;/strong&gt;：通常在&lt;strong&gt;后期&lt;/strong&gt;进行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现错误类型&lt;/strong&gt;：功能不正确或遗漏、界面错误、数据结构错误、性能错误、初始化和终止错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术&lt;/strong&gt;：&lt;strong&gt;等价划分&lt;/strong&gt;、&lt;strong&gt;边界值分析&lt;/strong&gt;、&lt;strong&gt;错误推测&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;白盒测试 (White-box Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：把程序装在&lt;strong&gt;透明盒子里&lt;/strong&gt;，测试者完全知道程序的结构和处理算法，&lt;strong&gt;按照程序内部逻辑进行测试&lt;/strong&gt;，检查执行通路是否按预定要求工作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别称&lt;/strong&gt;：&lt;strong&gt;结构测试&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理解&lt;/strong&gt;：关心&lt;strong&gt;结果是否正确&lt;/strong&gt;且&lt;strong&gt;过程是否正确&lt;/strong&gt; (类比数学题，过程错结果对，白盒老师判错)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用阶段&lt;/strong&gt;：通常在&lt;strong&gt;早期&lt;/strong&gt;使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关注重点&lt;/strong&gt;：&lt;strong&gt;模块的接口、局部数据结构、重要的执行通路、出错处理通路、边界条件&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;技术：
&lt;ul&gt;
&lt;li&gt;逻辑覆盖 (Logic Coverage)：选取具有代表性的软件路径进行测试，是穷尽测试唯一可行的替代办法。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语句覆盖 (Statement Coverage)&lt;/strong&gt;：最弱，要求程序的&lt;strong&gt;每个语句都执行一次&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定覆盖 (Decision Coverage / Branch Coverage)&lt;/strong&gt;：每个语句执行一次，且&lt;strong&gt;每一个判定结果的每种可能结果都执行一次&lt;/strong&gt; (每个分支至少执行一次)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条件覆盖 (Condition Coverage)&lt;/strong&gt;：每个语句执行一次，且&lt;strong&gt;判定表达式的每个条件都能取得各种可能结果&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;判定/条件组合覆盖等 (要求更严格)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;控制结构测试 (Control Structure Testing)：
&lt;ul&gt;
&lt;li&gt;基本路径测试 (Basis Path Testing)：非常重要。
&lt;ul&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;根据设计结果&lt;strong&gt;画出相应的流图&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;计算环形复杂度 (Cyclomatic Complexity)：
&lt;ul&gt;
&lt;li&gt;方法一：&lt;code&gt;V(G) = P + 1&lt;/code&gt; (P为判定节点数)。&lt;/li&gt;
&lt;li&gt;方法二：数闭区间数量加一。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确定线性独立路径的基本集合&lt;/strong&gt;：独立路径指至少引入程序一条新处理语句或一条新条件路径，或一条之前未使用的边。路径数量等于环形复杂度。&lt;/li&gt;
&lt;li&gt;设计测试用例强制执行基本集合中的每条路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;条件测试、循环测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灰盒测试 (Grey-box Testing)&lt;/strong&gt;：介于黑盒与白盒之间的一种测试方法。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;7.2.5 测试步骤&lt;/strong&gt; (按顺序，及发现错误类型)&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;模块测试 (Module Testing) / 单元测试 (Unit Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：保证每个模块作为单元正常运行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现错误类型&lt;/strong&gt;：&lt;strong&gt;编码和详细设计的错误&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要使用&lt;/strong&gt;：&lt;strong&gt;白盒测试技术&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;手段：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码审查 (Code Review)&lt;/strong&gt;：人工进行，可由编写者非正式进行，或由审查小组正式进行 (组长、设计者、编写者、测试者组成)。&lt;strong&gt;高效&lt;/strong&gt;，能查出30%-70%的逻辑设计错误和编码错误。与计算机测试互补。&lt;/li&gt;
&lt;li&gt;计算机测试 (Computer Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;驱动软件 (Driver Software)&lt;/strong&gt;：假的主程序，接收测试数据，传输给被测试模块，并打印结果。用于测试&lt;strong&gt;底层模块&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存根软件 (Stub Software)&lt;/strong&gt;：被代替模块所调用的模块 (虚拟子程序)，用于代替底层小弟接收指令。用于测试&lt;strong&gt;顶层模块&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺陷&lt;/strong&gt;：驱动和存根软件&lt;strong&gt;代表开销&lt;/strong&gt;，增加成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;子系统测试 (Subsystem Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：将单元模块放在一起，测试&lt;strong&gt;模块相互之间的协调、通信&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现错误类型&lt;/strong&gt;：&lt;strong&gt;模块接口错误&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：兼有测试和组装两重含义，常称之为&lt;strong&gt;集成测试&lt;/strong&gt;的一部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;系统测试 (System Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：将测试的子系统装配成一个完整的整体进行测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现错误类型&lt;/strong&gt;：&lt;strong&gt;软件设计中的错误&lt;/strong&gt;以及&lt;strong&gt;需求说明中的错误&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：兼有测试和组装两重含义，常称之为&lt;strong&gt;集成测试&lt;/strong&gt;的一部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;集成测试 (Integration Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;包含&lt;/strong&gt;：子系统测试和系统测试。&lt;/li&gt;
&lt;li&gt;模块组装方法：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非渐增式 (Non-incremental)&lt;/strong&gt;：先分别测试每个模块，再全部组装成程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐增式 (Incremental)&lt;/strong&gt;：将下一个要测试的模块与已测试好的模块结合，每次增加一个。&lt;strong&gt;更彻底，易于定位错误位置&lt;/strong&gt;，通常推荐使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;渐增式策略 (两种)：
&lt;ul&gt;
&lt;li&gt;自顶向下集成 (Top-down Integration)：
&lt;ul&gt;
&lt;li&gt;从主控模块 (上层) 开始向下移动，逐渐结合模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：能在&lt;strong&gt;测试早期验证软件主要功能&lt;/strong&gt;，&lt;strong&gt;早期发现上层模块的接口错误&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;strong&gt;需要存根程序&lt;/strong&gt;，底层发现错误较晚。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自底向上集成 (Bottom-up Integration)：
&lt;ul&gt;
&lt;li&gt;从原子模块 (底层) 开始向上组装测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;strong&gt;不需要存根程序&lt;/strong&gt;，&lt;strong&gt;底层模块发现错误较早&lt;/strong&gt;，能充分展示人力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;strong&gt;需要驱动程序&lt;/strong&gt;，验证主要功能和发现上层接口错误较晚。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;回归测试 (Regression Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：执行已做过测试的某个子集，&lt;strong&gt;保证软件由于调试或其他原因引起的变动不会带来非预期副作用&lt;/strong&gt; (如引入新的错误)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验收测试 (Acceptance Testing) / 确认测试 (Confirmation Testing)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：把软件作为一个单一实体进行测试，&lt;strong&gt;验证软件的有效性&lt;/strong&gt; (软件功能和性能如同用户合理期待)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;strong&gt;用户积极参与&lt;/strong&gt;，主要使用&lt;strong&gt;实际数据&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现错误类型&lt;/strong&gt;：&lt;strong&gt;需求规格说明书中的错误&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要使用&lt;/strong&gt;：&lt;strong&gt;黑盒测试&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要内容&lt;/strong&gt;：&lt;strong&gt;软件配置复查&lt;/strong&gt;，确保所有成分齐全，质量符合要求，文档和程序一致，便于维护。&lt;/li&gt;
&lt;li&gt;分类：
&lt;ul&gt;
&lt;li&gt;阿尔法测试 (Alpha Testing)：
&lt;ul&gt;
&lt;li&gt;在&lt;strong&gt;开发者场所进行&lt;/strong&gt;，开发者在用户指导下进行，记录错误，&lt;strong&gt;受控环境&lt;/strong&gt;。开发者是主导地位。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;贝塔测试 (Beta Testing)：
&lt;ul&gt;
&lt;li&gt;由&lt;strong&gt;最终用户在一个或多个客户场所进行&lt;/strong&gt;，开发者通常不在场，软件在&lt;strong&gt;开发者不能控制的环境&lt;/strong&gt;下进行&lt;strong&gt;真实应用&lt;/strong&gt;。用户拥有更多权利。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;平行运行 (Parallel Running)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：&lt;strong&gt;同时运行新开发的系统和即将被取代的旧系统&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;目的/优点：
&lt;ul&gt;
&lt;li&gt;可在&lt;strong&gt;准生产环境&lt;/strong&gt;中运行新系统，不冒风险。&lt;/li&gt;
&lt;li&gt;用户有时间&lt;strong&gt;熟悉新系统&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;可以&lt;strong&gt;验证用户手册&lt;/strong&gt;等文档。&lt;/li&gt;
&lt;li&gt;以准生产模式验证&lt;strong&gt;性能指标&lt;/strong&gt; (如负载冲击测试)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;7.2.6 测试阶段的信息流 (使用的文档资料)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;软件配置文档：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;需求说明书&lt;/strong&gt;：用于编写用例，检查是否满足需求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计说明书&lt;/strong&gt;：用于检测软件设计问题和进行白盒测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源程序清单&lt;/strong&gt; (代码)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;测试相关文档：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试计划&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试方案&lt;/strong&gt;：不仅包含输入数据，还需有每组数据预期检验的功能和预期得到的正确输出 (像有题有答案)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;7.8 调试 (Debugging)&lt;a href=&quot;#78-调试-debugging&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：作为&lt;strong&gt;成功测试的后果出现&lt;/strong&gt;，是&lt;strong&gt;发现错误后排错的过程&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过程&lt;/strong&gt;：执行测试用例 -&amp;gt; 产生结果 -&amp;gt; 调试 (一眼识出/推测验证) -&amp;gt; 确认改正。&lt;/li&gt;
&lt;li&gt;调试困难的原因 (心理、技术、软件固有特征)：
&lt;ul&gt;
&lt;li&gt;症状与问题发生地距离远。&lt;/li&gt;
&lt;li&gt;改正错误后症状暂时消失。&lt;/li&gt;
&lt;li&gt;症状并非由错误引起。&lt;/li&gt;
&lt;li&gt;症状可能由不易跟踪的人为引起。&lt;/li&gt;
&lt;li&gt;症状可能由定时问题引起。&lt;/li&gt;
&lt;li&gt;很难产生完全一样的输入条件 (难以复现)。&lt;/li&gt;
&lt;li&gt;症状时有时无。&lt;/li&gt;
&lt;li&gt;症状可能分布在多个任务中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;调试的途径 (3种)：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;蛮干法 (Brute-force Method)&lt;/strong&gt;：其他方法失效后的&lt;strong&gt;最后手段&lt;/strong&gt;，地毯式搜索。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回溯法 (Backtracking Method)&lt;/strong&gt;：&lt;strong&gt;常用调试方法&lt;/strong&gt;，从发现症状的地方人工沿控制流程回溯追踪错误点，&lt;strong&gt;小程序适用&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;原因排除法 (Cause Elimination Method)：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对分查找法 (Binary Partitioning)&lt;/strong&gt;：将程序一分为二，逐步缩小错误范围。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归纳法 (Induction)&lt;/strong&gt;：从个别现象推断一般结论，组织分析错误数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;演绎法 (Deduction)&lt;/strong&gt;：从原理和前提出发，设想问题原因并逐个验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;7.9 软件可靠性 (Software Reliability)&lt;a href=&quot;#79-软件可靠性-software-reliability&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;定义：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;软件可靠性&lt;/strong&gt;：在&lt;strong&gt;给定时间间隔内&lt;/strong&gt;成功运行的概率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件可用性 (Availability)&lt;/strong&gt;：在&lt;strong&gt;给定时间点&lt;/strong&gt;成功运行的概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;估算平均无故障时间的方法&lt;/strong&gt;：&lt;strong&gt;MTTF&lt;/strong&gt; (Mean Time To Failure) 是一个重要的参考指标。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;</content:encoded></item><item><title>第一章 数据挖掘概述</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E6%A6%82%E8%BF%B0/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E6%A6%82%E8%BF%B0/</guid><description>第一章 数据挖掘概述</description><pubDate>Mon, 02 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;什么是数据挖掘？&lt;a href=&quot;#什么是数据挖掘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;数据挖掘不是简单地从网络或数据库搜索数据。&lt;/li&gt;
&lt;li&gt;数据挖掘与&lt;strong&gt;知识发现 (Knowledge Discovery in Database, KDD)&lt;/strong&gt; 相关。&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;数据挖掘 (Data Mining, DM)&lt;/strong&gt; 定义&lt;a href=&quot;#数据挖掘-data-mining-dm-定义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;通用定义: 数据挖掘是发现数据中潜在的有用模式（信息、知识、规律、模型）的过程。
&lt;ul&gt;
&lt;li&gt;例如：猎人在动物迁徙行为中寻找模式，农夫在庄稼生长中寻找模式，政客在选民意见中寻找模式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;技术角度: 利用一种或多种计算机学习技术，从数据中自动分析并提取信息的处理过程。
&lt;ul&gt;
&lt;li&gt;目的是寻找和发现数据中&lt;strong&gt;潜在的、有价值的信息、知识、规律、联系和模式&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;与计算机科学有关，通常使用&lt;strong&gt;机器学习、统计学、联机分析处理、专家系统和模式识别&lt;/strong&gt;等多种方法实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学科角度&lt;/strong&gt;: 是一门&lt;strong&gt;交叉学科&lt;/strong&gt;，涉及数据库技术、人工智能技术、统计学、可视化技术、并行计算等多种技术。&lt;/li&gt;
&lt;li&gt;商业角度: 是一种商业智能信息处理技术。
&lt;ul&gt;
&lt;li&gt;围绕商业目标开展，对大量商业数据进行抽取、转换、分析和处理。&lt;/li&gt;
&lt;li&gt;从中提取&lt;strong&gt;辅助商业决策的关键性数据&lt;/strong&gt;，揭示隐藏的、未知的或验证已知的规律性。&lt;/li&gt;
&lt;li&gt;是一种&lt;strong&gt;深层次的商业数据分析方法&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘与知识发现 (KDD) 的关系&lt;a href=&quot;#数据挖掘与知识发现-kdd-的关系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KDD&lt;/strong&gt; 是指&lt;strong&gt;从数据中发现有用知识的整个过程&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据挖掘&lt;/strong&gt; 是 &lt;strong&gt;KDD 过程中的一个特定步骤&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;数据挖掘是特定算法的应用，用于从数据中提取模式。&lt;/li&gt;
&lt;li&gt;KDD 过程的步骤:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选择&lt;/strong&gt;: 从数据到目标数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预处理&lt;/strong&gt;: 将目标数据转换为已处理数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;转换&lt;/strong&gt;: 将处理后的数据转换为转换数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据挖掘&lt;/strong&gt;: 将数据转换为模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解释和/或评估模式&lt;/strong&gt;: 将模式转化为知识。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘的四个“超级问题”或能做什么&lt;a href=&quot;#数据挖掘的四个超级问题或能做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;数据挖掘的核心任务或可以解决的问题包括：预测、聚类、关联分析和异常分析。进一步细化为以下几项功能：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分类 (Classification)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;: 使用已知类别的实例建立分类模型，对未知类别的实例进行分类。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;: &lt;strong&gt;离散量&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类别数&lt;/strong&gt;: &lt;strong&gt;确定&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用示例&lt;/strong&gt;: 评估信用卡申请者的风险等级（低、中、高）。&lt;/li&gt;
&lt;li&gt;与聚类的区别: &lt;strong&gt;分类通过有标注语料学习假设函数、确定决策分界&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;估值 (Estimation)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;: 根据已知属性值，估计一个&lt;strong&gt;连续值&lt;/strong&gt;的输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;: &lt;strong&gt;连续值&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量&lt;/strong&gt;: &lt;strong&gt;不确定&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用示例&lt;/strong&gt;: 根据购买模式，估计一个家庭的孩子个数、收入或财产。&lt;/li&gt;
&lt;li&gt;与分类的区别: 类似于分类，但输出是连续值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预测 (Prediction)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;: 通过分类或估值得出预测模型，用该模型对未知变量进行预测。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;: 通常通过&lt;strong&gt;分类或估值&lt;/strong&gt;的方法来实现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用示例&lt;/strong&gt;: 预测明天上证指数的收盘价。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相关分析 (Association Analysis)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;: 发现数据中属性之间的有价值的联系。生成关联规则，表达客户购买行为的关联关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用示例&lt;/strong&gt;: &lt;strong&gt;购物篮分析 (Market Basket Analysis)&lt;/strong&gt;——寻找零售产品之间有趣的关系，如购买A同时是否经常购买B。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法&lt;/strong&gt;: 生成关联规则。关联规则可以有多个输出属性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;算法&lt;/strong&gt;: 最著名的是 &lt;strong&gt;Apriori 算法&lt;/strong&gt; (Agrawal, 1993)。Apriori 算法&lt;strong&gt;不支持数值型数据&lt;/strong&gt;，需进行数据变换。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关联规则示例&lt;/p&gt;
&lt;p&gt;(基于感冒数据集):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IF Leukocytosis = Yes THEN Fever = Yes&lt;/li&gt;
&lt;li&gt;IF Increased-lym = No THEN Sore-throat = Yes&lt;/li&gt;
&lt;li&gt;IF Cooling-effect = Good THEN Fever = Yes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;聚类 (Clustering)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;: &lt;strong&gt;对实例分组&lt;/strong&gt;，把相似的实例放在一个聚类（簇）中。发现最能区分各聚类的典型属性，使用这些属性开发预测未来结果的模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;: 是一种&lt;strong&gt;无指导（无教师）的学习&lt;/strong&gt;。在学习训练之前，&lt;strong&gt;无预先定义好分类的实例&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法&lt;/strong&gt;: 数据实例按照某种相似性度量方法计算相似程度，将最相似的实例聚类在一个组——&lt;strong&gt;簇 (Cluster)&lt;/strong&gt; 中。然后解释和理解每个簇的含义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用示例&lt;/strong&gt;: 在信用卡公司，发现一组输入属性来区分接受寿险促销和未接受促销的持卡人。市场细分、社交圈分析、集群计算、天体数据分析。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与分类的区别: &lt;strong&gt;聚类通过簇内相似度及簇间的距离对不同簇进行划分&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;聚类技术/算法&lt;/strong&gt;: 基于划分（如 K-means）、基于分层、基于模型等。&lt;strong&gt;K-means (K-均值) 算法&lt;/strong&gt; 是一种最为常用和易用的算法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;K-means 算法过程: 迭代过程，分为簇分类和移动聚类中心。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定一个初始的簇的个数 (K)。&lt;/li&gt;
&lt;li&gt;任意选定 K 个对象作为初始簇中心。&lt;/li&gt;
&lt;li&gt;根据与簇中心的距离，每个对象被分配给最近的一个簇（簇分类）。&lt;/li&gt;
&lt;li&gt;计算每个簇中样本点的平均值，将相应的聚类中心移动到这个均值处。&lt;/li&gt;
&lt;li&gt;重复迭代，直到没有对象被重新分配或聚类中心不再改变。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;聚类结果示例&lt;/p&gt;
&lt;p&gt;(基于感冒数据集，K=2): 聚类为两个簇，每个簇有5个实例。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cluster0 = {1,3,4,8,9}&lt;/li&gt;
&lt;li&gt;Cluster1 = {2,5,6,7,10}&lt;/li&gt;
&lt;li&gt;簇的概念结构可表示为产生式规则。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;异常分析 (Anomaly Analysis) / 异常检测 (Anomaly Detection)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;: 通过数据挖掘方法发现与数据集分布不一致的异常数据。也被称为&lt;strong&gt;离群点、异常值检测&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;适用场景特点:
&lt;ul&gt;
&lt;li&gt;(1) 无标签或者类别极不均衡。&lt;/li&gt;
&lt;li&gt;(2) 异常数据跟样本中大多数数据的差异性较大。&lt;/li&gt;
&lt;li&gt;(3) 异常数据在总体数据样本中所占的比例很低。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;常见应用案例:
&lt;ul&gt;
&lt;li&gt;金融领域: 识别“欺诈用户”（信用卡申请欺诈、盗刷、信贷欺诈）。&lt;/li&gt;
&lt;li&gt;安全领域: 判断流量数据波动和是否受到攻击。&lt;/li&gt;
&lt;li&gt;电商领域: 识别“恶意买家”（羊毛党、恶意刷屏团伙）。&lt;/li&gt;
&lt;li&gt;生态灾难预警: 基于天气指标数据判断极端天气。&lt;/li&gt;
&lt;li&gt;医疗监控: 从医疗设备数据发现可能显示疾病状况的异常数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;与数据挖掘有关的概念&lt;a href=&quot;#与数据挖掘有关的概念&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;数据查询 (Data Query)
&lt;ul&gt;
&lt;li&gt;通过数据查询语言在数据中找出需要的数据或信息。&lt;/li&gt;
&lt;li&gt;与数据挖掘的区别: 数据查询获取的是&lt;strong&gt;浅知识或多维知识&lt;/strong&gt;，而数据挖掘获取的是&lt;strong&gt;潜在的、隐藏的信息或知识——隐含知识 (Hidden Knowledge)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;专家系统 (Expert System)
&lt;ul&gt;
&lt;li&gt;一种具有“智能”的计算机软件系统。&lt;/li&gt;
&lt;li&gt;能够模拟某个领域人类专家的决策过程，解决复杂问题。&lt;/li&gt;
&lt;li&gt;通常包含以规则形式表示的领域专家的知识和经验。&lt;/li&gt;
&lt;li&gt;专家系统方法与数据挖掘方法有所不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;机器学习 (Machine Learning)
&lt;ul&gt;
&lt;li&gt;是数据挖掘中常用的技术方法之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概念学习 (Concept Learning)&lt;/strong&gt;: 通过大量实例训练发现经验化规律。结果通常表现为概念。机器擅长学习概念。概念可以从传统、概率、样本三个角度看待。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归纳学习 (Induction-Based Learning)&lt;/strong&gt;: 基于归纳的学习，是机器学习的一种方式。通过观察特定实例、研究已有经验材料，获取和探索新知识，以概念形式表现。&lt;/li&gt;
&lt;li&gt;有指导的学习 (Supervised Learning):
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;: 通过对大量&lt;strong&gt;已知分类或输出结果值（有标记 labels）的实例&lt;/strong&gt;进行训练。调整模型结构，建立能够准确分类或预测未知模型的目的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用于&lt;/strong&gt;：&lt;strong&gt;分类、估值、预测&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;: 使用&lt;strong&gt;有标注数据集&lt;/strong&gt; (x(1),y(1)),(x(2),y(2)),…,(x(m),y(m))。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;: 学习出假设函数、确定决策分界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例方法&lt;/strong&gt;: 决策树、神经网络、回归分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;无指导的聚类 (Unsupervised Clustering):
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;: &lt;strong&gt;无指导（无教师）的学习&lt;/strong&gt;。&lt;strong&gt;未给出具体的标记 y(m)&lt;/strong&gt;，仅有数据集 (x(1), x(2),…,x(m))。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用于&lt;/strong&gt;：&lt;strong&gt;聚类&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;: 算法对同一类的进行划分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例方法&lt;/strong&gt;: K-means 算法、凝聚聚类方法、概念分层 Cobweb 算法、EM 算法。神经网络也可以建立无指导聚类模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;有监督学习的具体方法举例&lt;a href=&quot;#有监督学习的具体方法举例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;决策树 (Decision Tree)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种&lt;strong&gt;倒立树&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非叶子节点&lt;/strong&gt;表示在一个属性上的分类检查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;叶子节点&lt;/strong&gt;表示决策判断的结果。&lt;/li&gt;
&lt;li&gt;有很多算法 (文本提到 C4.5)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可以被翻译为一个产生式规则集合&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产生式规则格式&lt;/strong&gt;: IF 前提条件 THEN 结论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt; (基于感冒类型诊断): IF Sore-throat = No THEN Cold-type = Viral 等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;神经网络 (Neural Network)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一种具有统计特性的&lt;strong&gt;数学模型&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建思想源于人类神经网络的结构、功能和运行过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;试图&lt;strong&gt;模拟人脑功能&lt;/strong&gt;来完成学习。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;是非常流行的&lt;strong&gt;数据挖掘技术&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以建立&lt;strong&gt;有指导学习模型&lt;/strong&gt;和&lt;strong&gt;无指导聚类模型&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入属性必须是&lt;strong&gt;数值&lt;/strong&gt;的，输出属性可以是数值的或分类的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前馈 (Feed-Forward) 神经网络&lt;/p&gt;
&lt;p&gt;是常用的有指导的学习模型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常是&lt;strong&gt;全连接&lt;/strong&gt;的：每一层的每个节点都与其下一层的所有节点相连接，同层节点不相连。每个网络连接有&lt;strong&gt;权重值&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立神经网络模型的两个阶段:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;学习训练阶段&lt;/strong&gt;: 提交实例输入属性值，计算输出，与期望输出比较产生误差，通过修改连接权值传回网络。训练终止条件：达到迭代次数或错误率收敛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检验阶段&lt;/strong&gt;: 固定网络权重，用于计算新实例的输出值。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回归分析 (Regression Analysis)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种&lt;strong&gt;有监督的统计分析方法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;用来确定&lt;strong&gt;两个或两个以上变量之间的定量的依赖关系&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;建立一个&lt;strong&gt;数学方程&lt;/strong&gt;作为数学模型，来概化一组数值数据。&lt;/li&gt;
&lt;li&gt;进而进行&lt;strong&gt;数值数据的估值和预测&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;: 使用回归方程预估办公楼的价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘的过程 (KDD过程中的数据挖掘阶段)&lt;a href=&quot;#数据挖掘的过程-kdd过程中的数据挖掘阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;数据挖掘实验通常分为4个步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;准备数据:
&lt;ul&gt;
&lt;li&gt;重要且费时。&lt;/li&gt;
&lt;li&gt;明确目标后，从传统数据库、数据仓库和平面文件收集和抽取数据。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统数据库&lt;/strong&gt;: 操作型数据库，面向日常事务处理，关系模型，规范化二维关系表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据仓库&lt;/strong&gt;: 面向决策支持，非日常事务处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平面文件&lt;/strong&gt;: 数据量较小的数据集，如 Excel 电子表格。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;包括准备训练数据和检验数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;挖掘数据:
&lt;ul&gt;
&lt;li&gt;选择一种数据挖掘技术或算法，将数据提交给数据挖掘工具，应用算法建立模型。&lt;/li&gt;
&lt;li&gt;选择技术/算法需考虑:
&lt;ul&gt;
&lt;li&gt;(1) 判断学习是&lt;strong&gt;有指导还是无指导&lt;/strong&gt;的。&lt;/li&gt;
&lt;li&gt;(2) 数据集中哪些实例和属性提交；哪些作&lt;strong&gt;训练数据&lt;/strong&gt;；哪些作&lt;strong&gt;检验数据&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;(3) 如何设置数据挖掘算法的&lt;strong&gt;参数&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解释和评估结果:
&lt;ul&gt;
&lt;li&gt;检查数据挖掘输出，评估是否达到目标，确定发现的信息是否有价值。&lt;/li&gt;
&lt;li&gt;如果结果不理想，可以重复实验：(1) 使用新的数据实例或属性；(2) 选择新的数据挖掘算法或参数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据挖掘过程是一个迭代的过程&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;模型应用:
&lt;ul&gt;
&lt;li&gt;数据挖掘的&lt;strong&gt;终极目标&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;应用分类模型解决疾病诊断。&lt;/li&gt;
&lt;li&gt;应用聚类模型进行顾客分类，找出特征，为促销提供决策支持。&lt;/li&gt;
&lt;li&gt;应用关联分析模型找出商品购买关联关系，为货架摆放、促销提供决策支持。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘的作用&lt;a href=&quot;#数据挖掘的作用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;能够解决疾病诊断问题（如例1.1）。&lt;/li&gt;
&lt;li&gt;能够解决对顾客的分类问题，为促销活动等提供决策支持。&lt;/li&gt;
&lt;li&gt;能够找出商品购买关联关系，为货架摆放、商品促销提供决策支持。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘的应用案例&lt;a href=&quot;#数据挖掘的应用案例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;金融领域: 甄别虚假医疗凭据、识别洗钱行为、提高金融产品销售定价准确率。&lt;/li&gt;
&lt;li&gt;通信领域: 根据家庭特征确定客户倾向和需求，帮助签约和增加交易额。&lt;/li&gt;
&lt;li&gt;医疗领域: 通过心肌SPECT图像诊断冠心病。&lt;/li&gt;
&lt;li&gt;媒体娱乐: 分析票房收入确定受欢迎的演员和故事情节。&lt;/li&gt;
&lt;li&gt;科学研究: 发现第三类γ射线爆。&lt;/li&gt;
&lt;li&gt;体育领域: 优化战术组合 (NBA)。&lt;/li&gt;
&lt;li&gt;流媒体/内容推荐: 成功营销热播剧 (Netflix)。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据挖掘软件 - Weka&lt;a href=&quot;#数据挖掘软件---weka&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;简介:
&lt;ul&gt;
&lt;li&gt;全称: &lt;strong&gt;Waikato Environment for Knowledge Analysis&lt;/strong&gt; (怀卡托智能分析环境)。&lt;/li&gt;
&lt;li&gt;诞生于新西兰怀卡托大学 (University of Waikato)。&lt;/li&gt;
&lt;li&gt;基于 Java 的&lt;strong&gt;免费开源软件&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;集成了数据挖掘的机器学习算法和统计技术。&lt;/li&gt;
&lt;li&gt;功能: &lt;strong&gt;数据预处理、分类、聚类、关联分析、属性选择和交互式可视化&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;特点: 操作简单、易学易用，适合入门。若未安装 JRE 需下载包含 JRE 的版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weka 软件特点:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;支持多种文件格式 (结构化文本、数据挖掘格式、数据库接口)。&lt;/li&gt;
&lt;li&gt;支持&lt;strong&gt;连续型数值数据&lt;/strong&gt;和&lt;strong&gt;离散型（字符型和日期型）数据&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;强大的&lt;strong&gt;数据预处理功能&lt;/strong&gt;: 缺失数据处理、噪声处理、标准化、离散化、属性构造、变量转换、数据拆分、平滑等。&lt;/li&gt;
&lt;li&gt;提供&lt;strong&gt;数据挖掘功能&lt;/strong&gt;: 分类、聚类、关联、可视化。&lt;/li&gt;
&lt;li&gt;算法灵活: 提供算法组合、用户自定义算法嵌入、参数设置。&lt;/li&gt;
&lt;li&gt;报告和评估: 生成基本报告、测试报告、输出格式，实现模型解释、比较、数据评分。&lt;/li&gt;
&lt;li&gt;可视化功能: 数据、挖掘过程和结果可视化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weka 的文件格式:
&lt;ul&gt;
&lt;li&gt;默认使用 &lt;strong&gt;ARFF (Attribute-Relation File Format)&lt;/strong&gt; 格式。&lt;/li&gt;
&lt;li&gt;一种 ASCII 文本文件格式。&lt;/li&gt;
&lt;li&gt;由两部分组成:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;头信息 (Head Information)&lt;/strong&gt;: 关系的声明和属性的声明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据信息 (Data Information)&lt;/strong&gt;: 数据集中的数据实例 (Instance)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weka 的功能/界面:
&lt;ul&gt;
&lt;li&gt;有 4 种界面 (GUI)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explorer&lt;/strong&gt;: 数据挖掘用户最常用的界面。包含 6 个选项卡/功能: Preprocess (预处理), Classify (分类), Cluster (聚类), Associate (关联分析), Select attributes (属性选择), Visualize (可视化)。&lt;/li&gt;
&lt;li&gt;Experimenter。&lt;/li&gt;
&lt;li&gt;Knowledge Flow。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 Weka 的基本步骤: (以示例为基础)
&lt;ol&gt;
&lt;li&gt;准备数据。&lt;/li&gt;
&lt;li&gt;加载和预处理数据。&lt;/li&gt;
&lt;li&gt;建立模型（分类、聚类、关联分析等）。&lt;/li&gt;
&lt;li&gt;应用模型（如分类未知实例）、解释和评估结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;本讲小结&lt;a href=&quot;#本讲小结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据挖掘是建立模型，不是魔术！&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;模型建立是人类本性（归纳和分类）使然，是一个自然、有趣且有意义的过程。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>第二章 数据</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E6%95%B0%E6%8D%AE/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E6%95%B0%E6%8D%AE/</guid><description>第二章 数据</description><pubDate>Mon, 02 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;数据挖掘导论 第二章：数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本章重点介绍了数据及其基本概念、数据质量问题与处理方法，以及数据预处理技术和衡量数据对象之间相似性与相异性的度量方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.1 数据类型&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：数据集是数据对象的集合。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据对象 (Data Object)&lt;/strong&gt;：用一组刻画其基本特性（如物体质量或事件发生时间）的属性描述。
&lt;ul&gt;
&lt;li&gt;其他名称：记录、点、向量、模式、事件、案例、样本、观测或实体。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性 (Attribute)&lt;/strong&gt;：对象的性质或特性。
&lt;ul&gt;
&lt;li&gt;其他名称：变量、特性、字段、特征或维。&lt;/li&gt;
&lt;li&gt;例：眼球的颜色、温度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测量标度 (Measurement Scale)&lt;/strong&gt;：将数值或符号值与对象的属性相关联的规则（函数）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性 vs. 属性值&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;同样的属性可以映射到不同的值域中，例如身高可以用cm或m做单位。&lt;/li&gt;
&lt;li&gt;不同属性可以映射到同一组值的集合，例如ID和年龄，但属性值的性质不同（ID没有上限，年龄有最大最小值）。&lt;/li&gt;
&lt;li&gt;属性可以用一种不描述属性全部性质的方式测量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性的类型&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;属性可以通过数值的如下性质来描述：相异性 (= ≠), 序 (&amp;lt; &amp;gt;), 加法 (+ -), 乘法 (* /)。&lt;/li&gt;
&lt;li&gt;标称属性 (Nominal)：
&lt;ul&gt;
&lt;li&gt;值仅仅只是不同的名字，只提供足够的信息以区分对象。&lt;/li&gt;
&lt;li&gt;性质：相异性。&lt;/li&gt;
&lt;li&gt;允许的变换：任何一对一变换（例如值的排列）。&lt;/li&gt;
&lt;li&gt;例：邮政编码、雇员ID号、眼球颜色、性别。&lt;/li&gt;
&lt;li&gt;允许的操作：众数、熵、列联相关、χ²检验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;序数属性 (Ordinal)：
&lt;ul&gt;
&lt;li&gt;值提供足够的信息确定对象的序。&lt;/li&gt;
&lt;li&gt;性质：相异性、序。&lt;/li&gt;
&lt;li&gt;允许的变换：值的保序变换（新值 = f(旧值), 其中f是单调函数）。&lt;/li&gt;
&lt;li&gt;例：矿石硬度、{好，较好，最好}、成绩、街道号码。&lt;/li&gt;
&lt;li&gt;允许的操作：中值、百分位、秩相关、游程检验、符号检验.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;区间属性 (Interval)：
&lt;ul&gt;
&lt;li&gt;值之间的差是有意义的，存在测量单位。&lt;/li&gt;
&lt;li&gt;性质：相异性、序、加法.&lt;/li&gt;
&lt;li&gt;允许的变换：新值 = a × 旧值 + b, 其中a、b是常数.&lt;/li&gt;
&lt;li&gt;例：日历日期、摄氏或华氏温度.&lt;/li&gt;
&lt;li&gt;允许的操作：均值、标准差、皮尔逊相关、t和F检验.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;比率属性 (Ratio)：
&lt;ul&gt;
&lt;li&gt;差和比率都是有意义的。&lt;/li&gt;
&lt;li&gt;性质：相异性、序、加法、乘法.&lt;/li&gt;
&lt;li&gt;允许的变换：新值 = a × 旧值.&lt;/li&gt;
&lt;li&gt;例：绝对温度、货币量、计数、年龄、质量、长度、电流.&lt;/li&gt;
&lt;li&gt;允许的操作：几何平均、调和平均、百分比变差.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;上述属性类型可以分为分类的(定性的)和数值的(定量的).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离散 vs. 连续属性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;离散属性 (Discrete Attribute)：
&lt;ul&gt;
&lt;li&gt;有限或无限可数个值。&lt;/li&gt;
&lt;li&gt;常表示为整数变量。&lt;/li&gt;
&lt;li&gt;例：邮政编码, 计数, 文档集的词。&lt;/li&gt;
&lt;li&gt;注意：二元属性是离散属性的特例。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;连续属性 (Continuous Attribute)：
&lt;ul&gt;
&lt;li&gt;属性值为实数。&lt;/li&gt;
&lt;li&gt;实践中，实数只能用有限位数字的数度量和表示。&lt;/li&gt;
&lt;li&gt;一般用浮点变量表示。&lt;/li&gt;
&lt;li&gt;例：温度, 高度, 重量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据集的重要特性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;维度 (Dimensionality)：数据集中对象具有的属性数目。
&lt;ul&gt;
&lt;li&gt;维灾难 (Curse of Dimensionality)。&lt;/li&gt;
&lt;li&gt;维归约 (Dimensionality Reduction)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稀疏性 (Sparsity)&lt;/strong&gt;：具有非对称特征的数据集，一个对象的大部分属性上的值都为0。只存储和处理非零值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分辨率 (Resolution)&lt;/strong&gt;：模式依赖于度量尺度 (scale)。不同尺度下观察到的模式不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2.2 数据集类型&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;记录数据 (Record Data)：
&lt;ul&gt;
&lt;li&gt;典型情况。&lt;/li&gt;
&lt;li&gt;数据矩阵 (Data Matrix)：对象具有相同的固定数值属性集，视为多维空间中的点，可用m*n矩阵表示。&lt;/li&gt;
&lt;li&gt;文档数据 (Document Data)：每个文档是一个向量，分量为术语在文档中出现的次数。&lt;/li&gt;
&lt;li&gt;事务数据 (Transaction Data)：每条记录（事务）涉及一组项目。例：杂货店购物记录。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基于图 (Graph) 的数据：
&lt;ul&gt;
&lt;li&gt;带有对象之间联系的数据。例：HTML链接。&lt;/li&gt;
&lt;li&gt;具有图对象的数据：对象有结构，包含有联系的子对象。例：分子结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;有序 (Ordered) 数据：
&lt;ul&gt;
&lt;li&gt;常常涉及时间或空间序。&lt;/li&gt;
&lt;li&gt;时序数据 (Sequential Data)，也称时间数据 (Temporal Data)：时间次序重要，具体时间不重要。例：事务序列。&lt;/li&gt;
&lt;li&gt;序列数据 (Sequence Data)：个体项的序列。例：基因组序列数据（如DNA序列），重要的是在序列中的位置.&lt;/li&gt;
&lt;li&gt;时间序列数据 (Time Series Data)：特殊的时序数据，每个记录是时间序列（一段时间的测量序列）。具有时间自相关（临近测量值相似）。&lt;/li&gt;
&lt;li&gt;空间数据 (Spatial Data)：具有空间属性，如位置或区域。例：地理位置的气象数据。具有空间自相关性（物理上靠近的对象趋向于在其他方面也相似）。&lt;/li&gt;
&lt;li&gt;空间-时间数据 (Spatial-Temporal Data)：结合空间和时间序。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2.3 数据质量&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据质量问题&lt;/strong&gt;：离群点、遗漏值、不一致值、重复数据。&lt;/li&gt;
&lt;li&gt;测量误差 (Measurement Error) 和数据收集错误 (Data Collection Error)：
&lt;ul&gt;
&lt;li&gt;测量误差：测量过程导致的问题。&lt;/li&gt;
&lt;li&gt;数据收集错误：遗漏数据对象或属性值，或不正确包含对象等。&lt;/li&gt;
&lt;li&gt;都可能是系统的或随机的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;噪声 (Noise)&lt;/strong&gt;：测量误差的随机部分。可能扭曲值或附加谬误对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离群点 (Outliers)&lt;/strong&gt;：在某种意义上不同于数据集中其他大部分数据对象的特征。也称为异常对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;噪声与离群点区别&lt;/strong&gt;：噪声是随机测量误差，离群点是观测量中与大部分观测量明显不同的值，它既可能由真实数据产生，也可能由噪声带来。&lt;/li&gt;
&lt;li&gt;遗漏值 (Missing Values)：
&lt;ul&gt;
&lt;li&gt;原因：信息未收集全、属性不适用于所有样例。&lt;/li&gt;
&lt;li&gt;处理策略：删除数据对象、估计遗漏值、分析时忽略遗漏值、用所有可能值替换（按概率加权）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不一致值 (Inconsistent Values)&lt;/strong&gt;：数据可能包含互相矛盾的值。纠正需要附加或冗余信息。时序数据中的不一致可能是使用了不同的测量手段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复数据 (Duplicate Data)&lt;/strong&gt;：数据集可能包括互为冗余或几乎互为冗余的数据对象。是合并异构数据源时的主要问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据清理 (Data Cleaning)&lt;/strong&gt;：包括格式标准化、异常数据清除、错误纠正、重复数据清除。&lt;/li&gt;
&lt;li&gt;应用问题 (Application Issues)：
&lt;ul&gt;
&lt;li&gt;时效性 (Timeliness)：数据的快照只代表有限时间内的真实情况，过时数据上的模型也可能过时。&lt;/li&gt;
&lt;li&gt;相关性 (Relevance)：可用数据必须包含应用需要的信息，否则模型精度受限。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2.4 数据预处理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据预处理方法&lt;/strong&gt;：聚集、抽样、维归约、特征子集选择、特征构造、离散化与二元化、属性变换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;聚集 (Aggregation)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;定义：将两个或多个属性（或对象）组合成单个属性（或对象）。&lt;/li&gt;
&lt;li&gt;目的：
&lt;ul&gt;
&lt;li&gt;数据规约 (Data Reduction)：减少属性或对象数量。&lt;/li&gt;
&lt;li&gt;范围转换 (Change of Scale)：将细粒度数据聚集成粗粒度（如城市聚集成区域、州、国家）。&lt;/li&gt;
&lt;li&gt;数据更稳定 (More “Stable” Data)：聚集数据变异性更小。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;举例：澳大利亚降水变化的标准差在按地区聚集后变小.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抽样 (Sampling)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;定义：选择数据对象子集的常用方法。&lt;/li&gt;
&lt;li&gt;目的：用于数据初步调查和最终分析。在数据挖掘中使用抽样是因为处理整个数据集太昂贵或耗时。&lt;/li&gt;
&lt;li&gt;有效抽样原则：
&lt;ul&gt;
&lt;li&gt;代表性 (Representativeness)：如果样本具有代表性，使用样本几乎和使用整个数据集一样有效。&lt;/li&gt;
&lt;li&gt;保留原数据集的性质：如果样本与原始数据集大致具有相同的属性，则样本具有代表性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;抽样方法：
&lt;ul&gt;
&lt;li&gt;简单抽样 (Simple Random Sampling)：选择任何特定项目的概率相等。
&lt;ul&gt;
&lt;li&gt;简单无放回抽样 (Sampling without replacement)。&lt;/li&gt;
&lt;li&gt;简单有放回抽样 (Sampling with replacement)：同一对象可以被多次提取。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分层抽样 (Stratified Sampling)：将数据分成几个分区，然后从每个分区抽取随机样本。可以按相同个数或按比例抽取。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;样本大小：示例展示了不同样本大小对保留原数据集结构的影响（2000点保留大部分结构，500点丢失结构）。对于容量相等的组，需从每组至少找出一个代表点。&lt;/li&gt;
&lt;li&gt;渐进抽样 (Progressive Sampling) 或 自适应抽样 (Adaptive Sampling)：
&lt;ul&gt;
&lt;li&gt;原因：有时难以预先确定样本集大小。&lt;/li&gt;
&lt;li&gt;方法：从小样本开始，逐渐增加样本容量直到足够大。需要评估样本是否足够大（例如，预测模型准确率随样本容量增加趋于稳定时停止）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维归约 (Dimensionality Reduction)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;问题：数据集包含大量特征（如文档数据集数万词），导致维灾难。高维数据越来越稀疏，许多算法（分类、聚类）效果下降。&lt;/li&gt;
&lt;li&gt;目的：避免维灾难；降低数据挖掘算法空间和时间损耗；易于数据可视化；减少不相关特征或噪音。&lt;/li&gt;
&lt;li&gt;方法：
&lt;ul&gt;
&lt;li&gt;线性代数技术：主成分分析 (PCA)、奇异值分解 (SVD)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主成分分析 (PCA)&lt;/strong&gt;：目标是找到新的属性（主成分），是原有属性的线性组合，相互正交，能捕获数据最大变差。通过求协方差矩阵的特征向量定义新空间。关键在于选择“特征明显的、重要的信息”：同一维度内方差大（有个性，易分开），不同维度间关联度小（表征共同信息少，理想情况不相关，协方差为0，线性空间内正交）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征子集选择 (Feature Subset Selection)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;降低维度的另一种方法。&lt;/li&gt;
&lt;li&gt;原因：特征并非越多越好。&lt;/li&gt;
&lt;li&gt;需避免的特征：
&lt;ul&gt;
&lt;li&gt;冗余特征 (Redundant features)：重复一个或多个其他属性中的大部分信息。例：产品购买价格和支付的销售税。&lt;/li&gt;
&lt;li&gt;不相关特征 (Irrelevant features)：对数据挖掘任务无用。例：学生ID对预测GPA通常不相关。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;技术：
&lt;ul&gt;
&lt;li&gt;穷举方法 (Exhaustive methods)：尝试所有可能的特征子集作为算法输入。&lt;/li&gt;
&lt;li&gt;嵌入方法 (Embedded methods)：特征选择作为数据挖掘算法的一部分（如决策树算法本身决定哪些特征有用）。&lt;/li&gt;
&lt;li&gt;过滤方法 (Filter methods)：在运行数据挖掘算法之前选择特征。&lt;/li&gt;
&lt;li&gt;包装方法 (Wrapper methods)：使用数据挖掘算法作为黑箱来寻找最佳属性子集。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征创建 (Feature Creation)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;目标：创建出比原始特征更能体现对象本质的新特征。&lt;/li&gt;
&lt;li&gt;三种一般方法：
&lt;ul&gt;
&lt;li&gt;特征提取 (Feature Extraction)：领域相关（domain-specific）。映射数据到新空间（如傅里叶变换、小波变换）。更好的特征可以揭示数据重要性质。&lt;/li&gt;
&lt;li&gt;特征构造 (Feature Construction)：由一个或多个原始特征构造新特征。例：密度=质量/体积。原始特征形式不适合算法时，构造新特征可能更有用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离散化与二元化 (Discretization and Binarization)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;目的：减少属性值个数（便于挖掘，结果更简洁、易理解使用）；产生概念分层结构；满足某些算法（需要离散或二元属性）的要求。&lt;/li&gt;
&lt;li&gt;非监督 vs. 监督：差别在于是否使用类信息。&lt;/li&gt;
&lt;li&gt;离散属性二元化：
&lt;ul&gt;
&lt;li&gt;方法1：属性有m个值，每个值映射到[0, m-1]整数（保序），再将m个整数变换为二进制，用n=⌈log₂m⌉个二元属性表示。缺点：建立了属性值之间的联系，不适合非对称属性（1比0更重要）。&lt;/li&gt;
&lt;li&gt;方法2：对m个属性值建立m个二元变量，每个对应于一个原属性值。适合非对称属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;连续属性离散化：
&lt;ul&gt;
&lt;li&gt;基本思想：将排序后的连续属性值通过n-1个分割点分成n个区间。将一个区间中的值映射到相同分类值。问题是决定分割点数目和位置。分割点数目一般由用户确定。&lt;/li&gt;
&lt;li&gt;分割点位置确定方法：
&lt;ul&gt;
&lt;li&gt;非监督方法：等宽离散化、等频离散化、K-均值离散化。&lt;/li&gt;
&lt;li&gt;监督方法：假定数据属于不同类。原则是极大化区间纯度（区间中数据都属于一个类最纯，等比例属于各类最不纯）。有多种度量纯度的方法。&lt;/li&gt;
&lt;li&gt;基于熵的离散化：熵是一种不纯度度量。基本思想是初始切分成两部分使得结果区间产生最小熵，重复分割直到满足条件（区间数或终止条件）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;具有过多值的离散属性：
&lt;ul&gt;
&lt;li&gt;序数属性：用类似于连续属性的方法。&lt;/li&gt;
&lt;li&gt;标称属性：一般需要领域知识。例：系名（合并成工程学、社会科学等），城市（合并成省、国家）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性变换 (Attribute Transformation)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;定义：将给定属性的整个值集映射到一组新的替换值的函数。&lt;/li&gt;
&lt;li&gt;简单变换：xk, log(x), ex, |x|, 1/x 等简单函数。注意：可能改变数据特性。&lt;/li&gt;
&lt;li&gt;标准化 (Standardization) / 规范化 (Normalization)：在数据挖掘中不区分，统计学有不同含义。目标是使值集具有特定性质（如均值0、标准差1）。可使用均值/中位数，标准差/绝对标准差。公式例：x’ = (x - 均值) / 标准差。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2.5 相似性和相异性的度量 (Similarity and Dissimilarity Measures)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相似性 (Similarity)&lt;/strong&gt;：两个数据对象相似程度的数值度量。对象越相似，值越高。通常在范围内。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相异性 (Dissimilarity)&lt;/strong&gt;：两个数据对象之间差异的数值度量。对象越相似，值越低。最小不相似度通常为0。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;邻近性 (Proximity)&lt;/strong&gt;：指相似或不同之处。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据对象的相异度&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;欧氏距离 (Euclidean Distance)&lt;/strong&gt;：衡量n维空间中两点间的直线距离。公式：d(x, y) = √Σ(xk - yk)²。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;闵可夫斯基距离 (Minkowski Distance)&lt;/p&gt;
&lt;p&gt;：欧氏距离的推广。公式：d(x, y) = (Σ|xk - yk|^r)^(1/r)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;r = 1：城市街区距离 (Manhattan, taxicab, L1范数)。汉明距离是二元向量城市街区距离的常见例子。&lt;/li&gt;
&lt;li&gt;r = 2：欧几里得距离。&lt;/li&gt;
&lt;li&gt;r → ∞：上确界距离 (Lmax norm, L∞ norm)，是向量任意分量间最大差值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;距离的性质&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;非负性：d(x, y) ≥ 0，仅当x = y时d(x, y) = 0。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;对称性：d(x, y) = d(y, x)。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;三角不等式：d(x, z) ≤ d(x, y) + d(y, z)。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;满足这三个性质的测度称为&lt;strong&gt;度量 (metric)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;非度量的相异度 (Non-metric Dissimilarity)&lt;/strong&gt;：有些相异度不满足一个或多个度量性质。例：集合差 (size(A-B))，时间计算方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据对象之间的相似度&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常s(x, y) ∈。s(x, y)=1 (或最大相似度) 仅当x = y。s(x, y) = s(y, x) (对称性)。&lt;/li&gt;
&lt;li&gt;三角不等式（或类似性质）通常不成立。&lt;/li&gt;
&lt;li&gt;有时可将相似度变换成一种度量距离（如余弦相似性、Jaccard相似性）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;衡量相似度的方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简单匹配系数 (Simple Matching Coefficient, SMC)&lt;/strong&gt;：用于二元属性。衡量两个对象之间匹配的属性个数占总属性个数的比例。公式：SMC = (f₁₁+f₀₀) / (f₀₁+f₁₀+f₁₁+f₀₀)。例：对于x=(1,0,…,0), y=(0,0,…,1) (10维)，SMC=0.7。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jaccard系数 (Jaccard Coefficient)&lt;/strong&gt;：用于二元属性。衡量匹配个数（1-1匹配）占不涉及0-0匹配的属性个数的比例。更适合非对称二元属性（关注1-1匹配）。公式：J = f₁₁ / (f₀₁+f₁₀+f₁₁)。例：对于x=(1,0,…,0), y=(0,0,…,1) (10维)，J=0.0。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;余弦相似度 (Cosine Similarity)&lt;/strong&gt;：设x和y是两个向量。公式：cos(x, y) = (x · y) / (||x|| ||y||)。几何解释为向量夹角的余弦。例：对于x=(3,2,0,5,0,0,0,2,0,0), y=(1,0,0,0,0,0,0,1,0,2)，cos(x, y) ≈ 0.31.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;广义Jaccard系数 (Generalized Jaccard Coefficient)&lt;/strong&gt; 或 Tanimoto系数：用于向量。公式：EJ(x, y) = (x · y) / (||x||² + ||y||² - x · y)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相关性 (Correlation)&lt;/p&gt;
&lt;p&gt;：对象属性之间线性联系的度量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;皮尔森相关系数 (Pearson’s Correlation)。公式涉及协方差和标准差。范围[-1, 1]。corr(x, y)=0 表示不相关；corr(x, y)=1 (-1) 表示正(负)相关。散点图可可视化相关度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;邻近度计算问题 (Proximity Calculation Issues)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标准化&lt;/strong&gt;：当属性值域不同时，距离可能被值域大的属性左右。处理方法是变换到相同值域。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相关性&lt;/strong&gt;：当属性之间相关时，使用马氏距离 (Mahalanobis distance)。公式：mahalanobis(x, y) = (x - y)Σ⁻¹(x - y)ᵀ，其中Σ⁻¹是数据协方差矩阵的逆。协方差矩阵Σ的第ij个元素是第i和第j个属性的协方差。例：对于相关属性，马氏距离更能反映实际差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合异种属性&lt;/strong&gt;：当属性类型不同但需要计算总相似度时。算法2.1提供了一种方法：对每个属性计算的相似度sk(x,y)，定义指示变量δk（非对称属性且都为0或有遗漏值时δk=0，否则为1），使用加权公式计算总相似度：similarity(x, y) = (Σ δk sk(x, y)) / (Σ δk)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权&lt;/strong&gt;：如果不希望所有属性同等对待，可以使用权重wk（0~1之间，累加和为1）计算加权的相似度或加权的闵可夫斯基距离。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>第五章 总体设计</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%80%BB%E4%BD%93%E8%AE%BE%E8%AE%A1/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%80%BB%E4%BD%93%E8%AE%BE%E8%AE%A1/</guid><description>第五章 总体设计</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;1. 总体设计与详细设计&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关系&lt;/strong&gt;：总体设计与详细设计是&lt;strong&gt;全局&lt;/strong&gt;和&lt;strong&gt;局部&lt;/strong&gt;的关系。不是抽象与具体，也不是整体与部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;衔接工具&lt;/strong&gt;：&lt;strong&gt;软件结构图&lt;/strong&gt;是总体设计与详细设计之间的衔接工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分工&lt;/strong&gt;：总体设计（结构设计）主要确定系统由&lt;strong&gt;哪些模块组成&lt;/strong&gt;以及它们之间的&lt;strong&gt;关系&lt;/strong&gt;。详细设计（过程设计）主要确定&lt;strong&gt;每个模块的处理过程&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 总体设计的必要性&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必要性在于可以在一个&lt;strong&gt;全局的高度&lt;/strong&gt;、以&lt;strong&gt;较低的成本&lt;/strong&gt;，从&lt;strong&gt;较抽象的层次&lt;/strong&gt; 分析、对比各种系统实现方案和软件结构。&lt;/li&gt;
&lt;li&gt;从中选取&lt;strong&gt;最优解&lt;/strong&gt;（最佳方案和最合理的软件结构），从而以较低的成本开发出&lt;strong&gt;较高质量的软件系统&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 总体设计过程&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大体分为两个阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统设计阶段&lt;/strong&gt;：主要用来确定实现方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构设计阶段&lt;/strong&gt;：主要用来确定软件结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;详细过程（九个步骤）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设想供选择的方案&lt;/strong&gt;：常用方法是以需求分析阶段得到的&lt;strong&gt;数据流图&lt;/strong&gt;作为出发点。设想将数据流图中的处理进行分组的各种可能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选取合理方案&lt;/strong&gt;：一般选取&lt;strong&gt;低成本、中成本、高成本&lt;/strong&gt;至少三种方案。每种方案需配备资料，包括系统流程图、物理部件清单、成本效益分析、实现系统进度计划。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推荐最佳方案：分析对比各种可能方案的利弊，选取最佳方案，制定详细实现计划。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;（步骤 1-3 属于系统设计阶段）&lt;/em&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能分解&lt;/strong&gt;：确定系统由哪些模块组成及模块间的关系（结构设计）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计软件结构&lt;/strong&gt;：通常一个模块完成一个&lt;strong&gt;适当的子功能&lt;/strong&gt;。将模块组织成&lt;strong&gt;良好的层次系统&lt;/strong&gt;。层次结构是常见的考点，上层调用下层。顶层模块功能最抽象（发送调用命令），下层功能具体。可用&lt;strong&gt;层次图&lt;/strong&gt;或&lt;strong&gt;结构图&lt;/strong&gt;描绘。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计数据库&lt;/strong&gt;：&lt;em&gt;本章不详细赘述&lt;/em&gt;，后续章节更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;制定测试计划&lt;/strong&gt;：&lt;em&gt;本章不详细讨论&lt;/em&gt;，将在第七章展开。结合测试目的设计测试方案。注意：&lt;strong&gt;测试计划很早就在总体设计阶段实现&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;书写文档&lt;/strong&gt;：记录总体设计结果。文档包括：&lt;strong&gt;系统说明&lt;/strong&gt;（含系统流程图、系统构成方案）、&lt;strong&gt;用户手册&lt;/strong&gt;（根据总体设计结果修改需求阶段得到的初步手册）、&lt;strong&gt;测试计划&lt;/strong&gt;、详细实现计划、数据库设计结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;审查和复审&lt;/strong&gt;：进行详细的技术审查和管理复审。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. 设计原理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设计原理是软件设计过程应遵循的基本原理和概念。考试高频考点。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;模块化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模块&lt;/strong&gt;：程序的基本构件。由边界元素限定、有总体标识符代表的相邻元素序列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模块化&lt;/strong&gt;：将程序划分为独立命名、独立访问的模块。每个模块完成一个子功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使软件结构&lt;strong&gt;清晰&lt;/strong&gt;，易于设计、阅读和理解。&lt;/li&gt;
&lt;li&gt;使软件易于&lt;strong&gt;测试和调试&lt;/strong&gt;（错误局限在模块及接口），有助于提高可靠性。&lt;/li&gt;
&lt;li&gt;提高软件的&lt;strong&gt;可修改性&lt;/strong&gt;（变动通常只涉及少数模块），避免修改引入错误影响过多程序。&lt;/li&gt;
&lt;li&gt;有助于软件开发的&lt;strong&gt;组织管理&lt;/strong&gt;（分工合作）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;抽象&lt;/strong&gt;：将相似方面集中概括起来，&lt;strong&gt;暂时忽略差异&lt;/strong&gt;。抽象出事物的&lt;strong&gt;本质特征&lt;/strong&gt;，暂时不考虑细节。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逐步求精&lt;/strong&gt;：&lt;strong&gt;尽量推迟对问题细节的考虑&lt;/strong&gt;，集中精力解决主要问题。有助于工程师集中精力于当前开发阶段最相关的方面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;信息隐藏与局部化：与封装（第九章后）非常相像。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信息隐藏&lt;/strong&gt;：模块内包含的信息（过程和数据）对于不需要这些信息的模块&lt;strong&gt;不能访问&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;局部化&lt;/strong&gt;：将关系密切的软件元素&lt;strong&gt;物理地彼此靠近&lt;/strong&gt;。局部化有利于信息隐藏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：绝大多数部分被隐藏，修改期间引入的错误&lt;strong&gt;很少能传播到软件其他部分&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模块独立性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;概念：模块化、抽象、信息隐藏、局部化概念的&lt;strong&gt;直接结果&lt;/strong&gt;和&lt;strong&gt;集大成者&lt;/strong&gt;。开发具有&lt;strong&gt;独立功能&lt;/strong&gt;、与其他模块之间&lt;strong&gt;没有过多相互作用&lt;/strong&gt;的模块。&lt;/li&gt;
&lt;li&gt;重要性：
&lt;ul&gt;
&lt;li&gt;有效的模块化&lt;strong&gt;更容易开发&lt;/strong&gt;（分割功能、接口简化）。多人合作开发时尤其重要（与模块化优点相似）。&lt;/li&gt;
&lt;li&gt;模块&lt;strong&gt;比较容易测试和维护&lt;/strong&gt;（所需工作量小，错误传播范围小）（与抽象、信息隐藏优点相似）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;衡量尺度：&lt;strong&gt;内聚&lt;/strong&gt;和&lt;strong&gt;耦合&lt;/strong&gt;。模块独立是好设计的关键，设计决定软件质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. 衡量模块独立性的尺度：耦合与内聚&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;二者&lt;strong&gt;相反&lt;/strong&gt;。低耦合对应高内聚，高耦合对应低内聚。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;耦合 (Coupling)：标志着一个软件结构内&lt;/p&gt;
&lt;p&gt;不同模块之间相互关联的程度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;越弱越好&lt;/strong&gt;（松散耦合系统更好）。&lt;/li&gt;
&lt;li&gt;弱耦合优点：易于研究、测试、维护任一模块，不需了解其他部分。联系简单，错误传播可能性小。强烈影响系统的&lt;strong&gt;可理解性、可测试性、可靠性和可维护性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;类型（由低到高）：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据耦合 (Data Coupling)&lt;/strong&gt;：通过&lt;strong&gt;参数&lt;/strong&gt;交换信息（最好）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制耦合 (Control Coupling)&lt;/strong&gt;：传递信息包含&lt;strong&gt;控制信息&lt;/strong&gt;（如开关量）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征耦合 (Stamp Coupling)&lt;/strong&gt;：将&lt;strong&gt;整个数据结构&lt;/strong&gt;作为参数传递，调用模块&lt;strong&gt;只需要一部分&lt;/strong&gt;（给多了）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公共环境耦合 (Common Coupling)&lt;/strong&gt;：通过&lt;strong&gt;公共环境&lt;/strong&gt;相互作用（如全局变量、共享通信区等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容耦合 (Content Coupling)&lt;/strong&gt;：最高程度的耦合（最差）。如：模块访问另一模块内部数据、不通过正常入口转入内部、有部分程序代码重叠、模块有多个入口。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;设计原则：尽量使用数据耦合，少用控制/特征耦合，限制公共耦合范围，&lt;strong&gt;完全不用内容耦合&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内聚 (Cohesion)：标志着一个模块内&lt;/p&gt;
&lt;p&gt;各个元素彼此结合的紧密程度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;越高越好&lt;/strong&gt;（高内聚、强内聚、紧内聚更好）。&lt;/li&gt;
&lt;li&gt;类型（由低到高）：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;偶然内聚 (Coincidental Cohesion)&lt;/strong&gt;：模块完成一组任务，彼此关系松散（如为节省空间把重复语句放一起）。最低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑内聚 (Logical Cohesion)&lt;/strong&gt;：任务在逻辑上属于相同或相似一类（如产生各种类型的全部输出）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间内聚 (Temporal Cohesion)&lt;/strong&gt;：任务必须在同一时间段内执行（如初始化工作）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过程内聚 (Procedural Cohesion)&lt;/strong&gt;：处理元素相关，必须以特定次序执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信内聚 (Communicational Cohesion)&lt;/strong&gt;：所有元素使用&lt;strong&gt;同一个输入数据&lt;/strong&gt;，产生&lt;strong&gt;同一个输出数据&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顺序内聚 (Sequential Cohesion)&lt;/strong&gt;：处理元素与同一功能密切相关，&lt;strong&gt;必须顺序执行&lt;/strong&gt;（前一元素输出是后一元素输入）。高内聚。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能内聚 (Functional Cohesion)&lt;/strong&gt;：所有元素同属于一个整体，完成&lt;strong&gt;单一的功能&lt;/strong&gt;。最高程度的内聚（最好）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. 启发规则（设计经验）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;软件设计中应注意和遵循的经验。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;提高模块的独立性（&lt;strong&gt;低耦合、高内聚&lt;/strong&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模块的规模应&lt;strong&gt;适中&lt;/strong&gt;。过大分解不充分，独立性低；过小开销大于操作，接口复杂。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;深度、宽度、扇入、扇出&lt;/p&gt;
&lt;p&gt;都应适当。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;深度 (Depth)&lt;/strong&gt;：软件结构中&lt;strong&gt;控制的层数&lt;/strong&gt;。粗略标志系统大小复杂程度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宽度 (Width)&lt;/strong&gt;：同一层次上模块总数的&lt;strong&gt;最大值&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扇出 (Fan-out)&lt;/strong&gt;：一个模块&lt;strong&gt;直接调用&lt;/strong&gt;的模块数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扇入 (Fan-in)&lt;/strong&gt;：有多少个上级模块&lt;strong&gt;直接调用&lt;/strong&gt;它。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模块的作用域 (Scope of Effect)和控制域 (Scope of Control)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用域&lt;/strong&gt;：受模块内一个&lt;strong&gt;判定&lt;/strong&gt;影响的所有集合。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;控制域&lt;/strong&gt;：模块本身及所有直接或间接&lt;strong&gt;从属于&lt;/strong&gt;它的模块。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;力争降低模块的&lt;strong&gt;接口复杂度&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设计&lt;strong&gt;单入口、单出口&lt;/strong&gt;的模块。易于理解和维护。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模块的功能应该&lt;strong&gt;可以预测&lt;/strong&gt;，防止过分局限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;7. 描绘软件结构的图形工具&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;层次图 (Hierarchy Diagram)&lt;/strong&gt;：描绘软件的&lt;strong&gt;层次结构&lt;/strong&gt;。矩形框代表模块，联系表示&lt;strong&gt;调用关系&lt;/strong&gt;（与层次方框图、JASON图表示的组成关系不同）。适用于自顶向下设计。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HIPO图 (Hierarchy plus Input-Process-Output)&lt;/strong&gt;：层次图 + 输入处理输出图 (IPO)。IPO图用于描述算法。特点是&lt;strong&gt;可追踪性&lt;/strong&gt;（非顶层方框有编号）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;结构图 (Structure Chart)&lt;/strong&gt;：与层次图类似，都用于描绘软件结构。框之间表示&lt;strong&gt;调用关系&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;8. 面向数据流的设计方法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常也称为&lt;strong&gt;结构化设计方法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;基于&lt;strong&gt;数据流&lt;/strong&gt;来设计软件结构。&lt;/li&gt;
&lt;li&gt;数据流的类型决定&lt;strong&gt;映射方法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;两种数据流类型：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变换流 (Transform Flow)&lt;/strong&gt;：信息沿输入通路进入（外部转内部），经&lt;strong&gt;变换中心&lt;/strong&gt;处理，沿输出通路离开（内部转外部）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事物流 (Transaction Flow)&lt;/strong&gt;：数据流到达&lt;strong&gt;事务中心&lt;/strong&gt;（处理器），事务中心根据类型选取若干动作序列之一执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>第六章 详细设计</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E5%85%AD%E7%AB%A0-%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E5%85%AD%E7%AB%A0-%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/</guid><description>第六章 详细设计</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;1. 详细设计的基本概念&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务&lt;/strong&gt;：详细设计的任务&lt;strong&gt;不是具体的编写代码&lt;/strong&gt;。而是要&lt;strong&gt;设计出程序的蓝图&lt;/strong&gt;。程序员将根据这个蓝图写出实际的代码。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;考试判断题高频考点&lt;/strong&gt;：详细设计&lt;strong&gt;是编码的依据&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与总体设计关系&lt;/strong&gt;：总体设计（结构设计）确定系统由哪些模块组成及关系；详细设计（过程设计）确定&lt;strong&gt;每个模块的处理过程&lt;/strong&gt;。总体设计与详细设计是&lt;strong&gt;全局&lt;/strong&gt;和&lt;strong&gt;局部&lt;/strong&gt;的关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 结构程序设计&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经典定义&lt;/strong&gt;：如果一个程序的代码块仅仅通过&lt;strong&gt;顺序&lt;/strong&gt;、&lt;strong&gt;选择&lt;/strong&gt;和&lt;strong&gt;重复&lt;/strong&gt;三种基本控制结构进行链接，并且每个代码块只有一个入口和一个出口，则称程序是结构化的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本控制结构&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;顺序 (A执行后执行B)&lt;/li&gt;
&lt;li&gt;选择/分支 (根据条件执行A或B)&lt;/li&gt;
&lt;li&gt;重复/循环 (根据条件重复执行A)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考试重点&lt;/strong&gt;：记住这三种基本结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 人机界面设计 (Human-Computer Interface Design)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重要性&lt;/strong&gt;：是接口设计的重要组成部分。对于交互式系统，人机界面设计、数据设计和体系结构设计与过程设计同等重要。用户能够直观感受到的就是界面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包含的四个方面&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;系统响应时间&lt;/strong&gt;：从用户完成某个控制动作到系统给出响应的时间。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;属性&lt;/strong&gt;：长度（过长/过短都有弊端）、易变性（相对于平均响应时间的偏差，可能更重要）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户帮助设施&lt;/strong&gt;：提供联机帮助使用户无需离开用户界面解决问题。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类型&lt;/strong&gt;：集成的（一开始设计，对用户工作敏感）、附加的（系统建成后添加，能力有限，对用户操作不敏感）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;出错信息处理&lt;/strong&gt;：交互系统给出的一些坏消息。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设计和编写时的注意事项 (属性)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;用用户可以理解的术语描述问题 (直白)。&lt;/li&gt;
&lt;li&gt;提供从错误中恢复的建设性意见 (帮助)。&lt;/li&gt;
&lt;li&gt;指出错误可能导致的负面后果 (提示检查/解决)。&lt;/li&gt;
&lt;li&gt;伴随听觉或视觉上的提示。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不能带有指责色彩&lt;/strong&gt; (中性陈述)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令交互&lt;/strong&gt;：用户和系统软件进行交互的方式 (如 CTRL+A/C/V)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理想情况&lt;/strong&gt;：所有应用软件使用&lt;strong&gt;一致&lt;/strong&gt;的命令方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计过程&lt;/strong&gt;：是一个&lt;strong&gt;迭代&lt;/strong&gt;的过程。用户评估和试用 -&amp;gt; 根据修改意见生成新版本 -&amp;gt; 循环直到用户满意。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估标准 (早期复审)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;规格说明书的长度/复杂程度 (预示用户学习工作量)。&lt;/li&gt;
&lt;li&gt;命令/动作数量、参数个数、单个操作个数 (预示交互时间/效率)。&lt;/li&gt;
&lt;li&gt;设计模型包含的动作/命令、系统状态数量 (预示用户需要记忆的内容)。&lt;/li&gt;
&lt;li&gt;界面风格、帮助设施、出错处理协议 (预示界面复杂程度/用户接受程度)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计指南&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一般交互指南 (全局性)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;保持&lt;strong&gt;一致性&lt;/strong&gt; (菜单、命令、显示等风格一致)。&lt;/li&gt;
&lt;li&gt;提供有意义的&lt;strong&gt;反馈&lt;/strong&gt; (视觉/听觉双向通信)。&lt;/li&gt;
&lt;li&gt;执行有较大破坏动作前要求&lt;strong&gt;用户确认&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;允许&lt;strong&gt;取消绝大多数操作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少&lt;/strong&gt;两次操作之间必须&lt;strong&gt;记忆的信息量&lt;/strong&gt; (如短验证码).&lt;/li&gt;
&lt;li&gt;提高对话/思考效率 (减少按键/鼠标移动)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;允许犯错&lt;/strong&gt; (系统有容错能力，不是非常脆弱)。&lt;/li&gt;
&lt;li&gt;按功能对动作进行&lt;strong&gt;分类&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;提供对用户工作内容敏感的&lt;strong&gt;帮助设施&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;使用简单的&lt;strong&gt;动词&lt;/strong&gt;或动词短语作为命令名。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信息显示指南&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只显示&lt;/strong&gt;与当前工作内容相关的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要用数据研磨用户&lt;/strong&gt; (用图形、表格、图表等易于吸收的方式表示)。&lt;/li&gt;
&lt;li&gt;使用&lt;strong&gt;一致&lt;/strong&gt;的标记、标准缩写和可预知的颜色.&lt;/li&gt;
&lt;li&gt;允许用户保持&lt;strong&gt;可视化语境&lt;/strong&gt; (如图片放缩后仍能看到原始大小).&lt;/li&gt;
&lt;li&gt;产生有意义的&lt;strong&gt;出错信息&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;使用大小写、缩进、文本分组方式帮助理解。&lt;/li&gt;
&lt;li&gt;使用窗口分割不同类型的信息。&lt;/li&gt;
&lt;li&gt;模拟显示方式使信息易提取 (如电池颜色表示电量)。&lt;/li&gt;
&lt;li&gt;高效率使用显示屏。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据输入指南&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;尽量减少用户的输入动作&lt;/strong&gt; (减少点击次数，用划标尺等)。&lt;/li&gt;
&lt;li&gt;保持信息显示与数据输入的&lt;strong&gt;一致性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;允许用户&lt;strong&gt;自定义输入&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;交互方式应&lt;strong&gt;灵活&lt;/strong&gt;并可调节 (鼠标、键盘、语音等)。&lt;/li&gt;
&lt;li&gt;在当前动作中&lt;strong&gt;不适用&lt;/strong&gt;的命令&lt;strong&gt;不起作用&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;让用户控制交流流。&lt;/li&gt;
&lt;li&gt;对所有的输入动作都提供&lt;strong&gt;帮助&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;消除&lt;strong&gt;冗余输入&lt;/strong&gt; (设置默认值)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. 过程设计工具&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第六章&lt;strong&gt;考试考察最多的位置&lt;/strong&gt;。重点掌握&lt;strong&gt;文字上的考点&lt;/strong&gt; (优缺点，特点)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序流程图 (Program Flowchart)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：很直观，便于初学者掌握。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点 (高频考点)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;本质上&lt;strong&gt;不是逐步求精工具&lt;/strong&gt;，诱使程序员过早考虑控制流程。&lt;/li&gt;
&lt;li&gt;用箭头代表控制流，程序员&lt;strong&gt;不受约束&lt;/strong&gt;，可以随意转移控制 (违背结构程序设计精神)。&lt;/li&gt;
&lt;li&gt;不易表示&lt;strong&gt;数据结构&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;盒图 (N-S Chart / NS图)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;功能块明确，&lt;strong&gt;一眼看出&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不可能&lt;/strong&gt;任意转移控制。&lt;/li&gt;
&lt;li&gt;容易确定局部和全局数据的作用域。&lt;/li&gt;
&lt;li&gt;容易表示嵌套关系，也可表示模块的层次结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PAD图 (Problem Analysis Diagram)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;使用结构化程序设计符号，设计的程序&lt;strong&gt;必然是结构化的&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;描绘的程序结构&lt;strong&gt;非常清晰&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;表示程序逻辑易读易懂易记。&lt;/li&gt;
&lt;li&gt;容易转化为&lt;strong&gt;高级语言&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;用于表示程序逻辑，也可表示&lt;strong&gt;数据结构&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;支持&lt;strong&gt;自顶向下逐步求精&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定表和判定树 (Decision Table &amp;amp; Decision Tree)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共同点&lt;/strong&gt;：都能表示&lt;strong&gt;复杂的条件组合&lt;/strong&gt;与应做动作之间的对应关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定表优点&lt;/strong&gt;：可以&lt;strong&gt;简洁&lt;/strong&gt;又无歧义地描述处理规则。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定表缺点&lt;/strong&gt;：很难作为通用设计工具，难以同时表示顺序和重复等处理特性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定树优点&lt;/strong&gt;：简单到不需要解释。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判定树缺点&lt;/strong&gt;：简洁性不如判定表，同一元素同一值在树的叶端可能重复次数多。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过程设计语言 (PDL / 伪码)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;用&lt;strong&gt;正文形式&lt;/strong&gt;处理数据和处理过程的设计工具。常用在研究生论文中描述算法改进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：关键字固定语法、自然语言自由语法、数据说明手段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;可作为&lt;strong&gt;注释直接插入到程序&lt;/strong&gt;中。&lt;/li&gt;
&lt;li&gt;可以使用普通文本编辑器或文字处理系统编写 (方便)。&lt;/li&gt;
&lt;li&gt;已有自动处理PDL的程序，可转换为程序代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;与图形工具相比&lt;strong&gt;欠缺直观性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;描述复杂条件组合不如判定表和判定树简洁。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5. 面向数据结构的设计方法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常也称作&lt;strong&gt;结构化设计方法&lt;/strong&gt;，基于&lt;strong&gt;数据流&lt;/strong&gt;设计软件结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JASON图 (JSON图)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;描绘的是数据元素彼此之间的&lt;strong&gt;逻辑关系&lt;/strong&gt; (第三章层次方框图和JASON图表示组成关系，与层次图/结构图表示调用关系不同)。&lt;/li&gt;
&lt;li&gt;表示的三种逻辑关系：&lt;strong&gt;顺序&lt;/strong&gt;、&lt;strong&gt;选择&lt;/strong&gt;、&lt;strong&gt;重复&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：便于表示层次结构，形象直观，可读性好。既能表示&lt;strong&gt;数据结构&lt;/strong&gt;，也能表示&lt;strong&gt;程序结构&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：表示选择或重复结构时，选择条件或循环条件&lt;strong&gt;不能直接在图上表示&lt;/strong&gt;，影响表达能力且不易转换为程序。框间连线为斜线，不宜在行式打印机上输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JASON方法 (五步骤)&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;分析并确定输入/输出数据的逻辑关系，用JSON图描绘。&lt;/li&gt;
&lt;li&gt;找出输入数据和输出数据之间的对应数据单元。&lt;/li&gt;
&lt;li&gt;运用参数规则从描绘数据结构的JSON图导出描绘程序结构的JSON图。&lt;/li&gt;
&lt;li&gt;列出所有条件，分配到程序结构图适当位置。&lt;/li&gt;
&lt;li&gt;用伪码表示。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. 程序复杂程度的定量度量&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;价值/目的&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;估算软件中&lt;strong&gt;错误的数量&lt;/strong&gt;以及软件开发所需的&lt;strong&gt;工作量&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;用来&lt;strong&gt;比较&lt;/strong&gt;两个设计或不同算法的&lt;strong&gt;优劣&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;作为模块规模的&lt;strong&gt;精确限度&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;McCabe方法 (麦克笔方法)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流图 (Flow Graph)&lt;/strong&gt;：退化的程序流程图，仅仅描绘&lt;strong&gt;程序的控制流程&lt;/strong&gt;。不表现数据的具体操作以及分支/循环的具体条件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环形复杂度 (Cyclomatic Complexity)&lt;/strong&gt; - V(G):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标志程序&lt;strong&gt;逻辑复杂度&lt;/strong&gt;的定量尺度 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算方法 (三种)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;V(G) = P + 1&lt;/strong&gt;：P为&lt;strong&gt;判定节点的数目&lt;/strong&gt; (节点有 &amp;gt;1 个分支/路径)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V(G) = 封闭区域 + 1&lt;/strong&gt; (自创方法)。&lt;/li&gt;
&lt;li&gt;V(G) = E - N + 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：图B，判定节点为1, 3, 6 (都有两个分支)，P=3。V(G) = 3 + 1 = 4。图中的封闭区域有3个 (绿色457A6，红色2457A7B3，1237B)，V(G) = 3 + 1 = 4。两种方法结果一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250602000805597.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250602000805460&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>第三章 需求分析</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%89%E7%AB%A0-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%89%E7%AB%A0-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90/</guid><description>第三章 需求分析</description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;为了开发出真正满足用户需求的软件产品，首先必须知道用户的需求。对软件需求的深人理解是软件开发工作获得成功的前提条件。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521095947355&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;任务&lt;a href=&quot;#任务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;确定对系统的综合要求&lt;a href=&quot;#确定对系统的综合要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;功能需求 系统必须提供的服务&lt;/li&gt;
&lt;li&gt;性能需求 系统必须满足的定时/容量约束，速度、主存/磁盘容量、安全性等&lt;/li&gt;
&lt;li&gt;可靠性和可用性需求 可靠性：给定时间段内，系统成功运行的概率。可用性：给定时间点内，系统成功运行的概率。量化了用户可以使用系统的程度&lt;/li&gt;
&lt;li&gt;出错处理需求&lt;/li&gt;
&lt;li&gt;接口需求 描述应用系统与它的环境通信的格式&lt;/li&gt;
&lt;li&gt;约束 设计约束和实际约束 在过程中应遵循的限制条件 精度、工具或语言约束&lt;/li&gt;
&lt;li&gt;逆向需求 说明系统不应该做什么 确定系统的边界&lt;/li&gt;
&lt;li&gt;将来可能提出的需求 维护&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;分析系统的数据要求&lt;a href=&quot;#分析系统的数据要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;构建数据库/数据要求&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;导出系统的逻辑模型&lt;a href=&quot;#导出系统的逻辑模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;修正系统开发计划&lt;a href=&quot;#修正系统开发计划&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;与用户沟通获取需求的方法&lt;a href=&quot;#与用户沟通获取需求的方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;访谈&lt;a href=&quot;#访谈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;正式 事先准备问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非正式 开放性问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发放调查表，书面回答比起口头表达更加准确&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;情景分析技术 给出具体情景&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;面向数据流自顶向下求精&lt;a href=&quot;#面向数据流自顶向下求精&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;section&gt;&lt;h5&gt;结构化分析方法（SA）&lt;a href=&quot;#结构化分析方法sa&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;面向数据流自顶向下逐步求精进行需求分析的方法&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;通过功能分解完成数据流图的细化&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;简易的规格说明技术&lt;a href=&quot;#简易的规格说明技术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;前两种用户比较被动&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250525234900857.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;快速建立软件原型&lt;a href=&quot;#快速建立软件原型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;快速&lt;/li&gt;
&lt;li&gt;容易修改&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;分析建模与规格说明&lt;a href=&quot;#分析建模与规格说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h5&gt;分析建模&lt;a href=&quot;#分析建模&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;数据模型 ER&lt;/li&gt;
&lt;li&gt;功能模型 DFD&lt;/li&gt;
&lt;li&gt;行为模型 状态图&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;软件需求规格说明&lt;a href=&quot;#软件需求规格说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;软件需求规格说明书，需求阶段得出的最主要的文档&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250525235355752.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250525235355695&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;验证软件需求&lt;a href=&quot;#验证软件需求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;一致性 复查软件规格说明书&lt;/li&gt;
&lt;li&gt;完整性&lt;/li&gt;
&lt;li&gt;现实性&lt;/li&gt;
&lt;li&gt;有效性&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>网络安全</title><link>https://printsdf.dpdns.org/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/</guid><description>网络安全</description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;网络安全&lt;a href=&quot;#网络安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;安全威胁&lt;a href=&quot;#安全威胁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;被动攻击&lt;a href=&quot;#被动攻击&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;攻击者通过窃听手段仅观察和分析网络中传输数据流中的敏感信息，而不对其进行干扰。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;主动攻击&lt;a href=&quot;#主动攻击&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;攻击者对网络中传输着的数据流进行各种处理。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521134914465.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521134907333&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;安全服务&lt;a href=&quot;#安全服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521135500448.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521135500333&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;密码学&lt;a href=&quot;#密码学&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;如果不论攻击者截获了多少密文，在密文中都没有足够的信息来唯一地确定出对应的明文，则这一密码体制称为无条件安全的，或称为理论上是不可破的。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;然而，在无任何条件限制下，目前几乎所有实用的密码体制均是可破的。因此，人们关心的是在计算（而不是理论上）是不可破的密码体制。 如果一个密码体制中的密码不能在一定时间内被可以使用的计算资源破解，则这一密码体制称为在计算上是安全的。&lt;/p&gt;&lt;section&gt;&lt;h5&gt;对称密钥&lt;a href=&quot;#对称密钥&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;对称密钥密码体制是指加密密钥与解密密钥相同的密码体制。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521140655665.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521140655551&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521140819439.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521140819375&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高级加密标准（Advanced Encryption Standard，AES）支持128比特、192比特和256比特的密钥长度，用硬件和软件都可以快速实现。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;公钥密码&lt;a href=&quot;#公钥密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521141335872.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521141335812&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;报文摘要和报文鉴别码&lt;a href=&quot;#报文摘要和报文鉴别码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521143832375.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521144025264.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521144025176&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521144110079.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521144109995&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;最有名的报文摘要算法（或称密码散列函数或散列算法）有MD5（Message Digest，MD-5）和安全散列算法1（Secure Hash Algorithm，SHA-1）。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521144633562.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521144633518&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521144830187.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521144830098&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;数字签名&lt;a href=&quot;#数字签名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;blockquote&gt;&lt;p&gt;在计算机网络中传送的报文可以使用数字签名（Digital Signature）来证明其真实来源。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521145006696.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521145006647&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521150809307.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521150809231&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;实体鉴别&lt;a href=&quot;#实体鉴别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;实体鉴别就是通信双方的一方验证另一方身份的技术，常简称为鉴别。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521152336516.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521152336424&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521152433536.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521152433474&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521153235840.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521153235759&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521153648540.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521153648445&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521153813144.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521153813028&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521153943884.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521153943800&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;访问控制（没讲）&lt;a href=&quot;#访问控制没讲&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521154143840.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521154143798&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250521154306882.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250521154306797&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;安全机制&lt;a href=&quot;#安全机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;物理层安全实例：信道加密&lt;a href=&quot;#物理层安全实例信道加密&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用的是物理机器：信道加密机，加密和解密用硬件来实现，因此加密和解密速度快，并且无须传送额外的数据，采用该技术不会减少网络的有效带宽。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530150123409.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530145951069&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530150114576.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据链路层&lt;a href=&quot;#数据链路层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530150559983.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530150559892&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530150935229.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530150935148&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;网络层&lt;a href=&quot;#网络层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530151815331.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530151815254&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530151840524.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530151840410&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530151911426.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530151911341&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530152137565.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530152137491&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530153050116.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530153050007&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530153245812.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530153245736&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530153303432.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530153303366&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530153448599.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530153448513&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250530153746671.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250530153746597&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>第二章 可行性研究</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E5%8F%AF%E8%A1%8C%E6%80%A7%E7%A0%94%E7%A9%B6/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E5%8F%AF%E8%A1%8C%E6%80%A7%E7%A0%94%E7%A9%B6/</guid><description>第二章 可行性研究</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;概述&lt;a href=&quot;#概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可行性研究的目的，就是用最小的代价在尽可能短的时间内确定问题是否能够解决&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;技术可行性&lt;/li&gt;
&lt;li&gt;经济可行性&lt;/li&gt;
&lt;li&gt;操作可行性&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;法律、社会效益等&lt;/p&gt;&lt;p&gt;可行性研究最根本的任务是对以后的行动方针提出建议。如果问题没有可行的解，分析员应该建议停止这项开发工程，以避免时间、资源、人力和金钱的浪费：如果问题值得解，分析员应该推荐一个较好的解决方案，并且为工程制定一个初步的计划&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;过程&lt;a href=&quot;#过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;复查系统规模和目标&lt;/li&gt;
&lt;li&gt;研究目前正在使用的系统-&amp;gt;系统流程图&lt;/li&gt;
&lt;li&gt;导出新系统的高层逻辑模型-&amp;gt;数据流图DFD+数据字典&lt;/li&gt;
&lt;li&gt;进一步定义问题&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518105435077.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518105427889&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;导出和评价供选择的解法&lt;/li&gt;
&lt;li&gt;推荐行动方针&lt;/li&gt;
&lt;li&gt;草拟开发计划 粗糙&lt;/li&gt;
&lt;li&gt;书写文档提交审查 可行性研究报告&lt;/li&gt;
&lt;/ol&gt;&lt;section&gt;&lt;h3&gt;系统流程图&lt;a href=&quot;#系统流程图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;描述当前运行的系统&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518105748113.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518105748043&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;数据流图&lt;a href=&quot;#数据流图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;数据加工处理的过程&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;绘图方法：自顶向下、分层绘制、逐步求精&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518105918804.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518105918715&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;用途&lt;a href=&quot;#用途&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;交流信息的工具&lt;/li&gt;
&lt;li&gt;分析和设计的工具&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;数据字典&lt;a href=&quot;#数据字典&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518110428205.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518110428145&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;相伴数据流图而生，解释数据流图的数据&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518110512792.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518110512720&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;用途&lt;a href=&quot;#用途-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;分析阶段的工具&lt;/li&gt;
&lt;li&gt;数据字典包含的每个数据元素的控制信息是很有价值的&lt;/li&gt;
&lt;li&gt;数据字典是开发数据库的第一步&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250518110820171.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250518110820092&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;成本估计&lt;a href=&quot;#成本估计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;软件开发成本主要表现wei&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>第一章 软件工程概述</title><link>https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%A6%82%E8%BF%B0/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%A6%82%E8%BF%B0/</guid><description>第一章 软件工程概述</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;软件工程的出现是因为存在软件危机。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;软件危机是指在计算机软件的&lt;strong&gt;开发&lt;/strong&gt;和&lt;strong&gt;维护&lt;/strong&gt;过程中所遇到的一系列严重问题。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h4&gt;具体表现&lt;a href=&quot;#具体表现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;对软件开发成本和速度的估计常常不准确。特别是人工工时，造成成本更高&lt;/li&gt;
&lt;li&gt;用户对软件不满意。需求分析不到位&lt;/li&gt;
&lt;li&gt;软件产品质量靠不住&lt;/li&gt;
&lt;li&gt;软件不可维护。文档、软件结构&lt;/li&gt;
&lt;li&gt;软件没有适当文档资料&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件成本在计算机系统总成本中所占的比例逐年上升&lt;/strong&gt;。人力消耗，工资涨&lt;/li&gt;
&lt;li&gt;软件开发生产率提高的速度，跟不上计算机应用迅速普及及深入的趋势。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;产生软件危机的原因&lt;a href=&quot;#产生软件危机的原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;软件本身的特点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;软件是逻辑部件，缺乏可见性&lt;/li&gt;
&lt;li&gt;错误隐藏深，测试阶段没有检测出来&lt;/li&gt;
&lt;li&gt;软件规模庞大，复杂度较高
&lt;ul&gt;
&lt;li&gt;技术上&lt;/li&gt;
&lt;li&gt;管理上，人员多&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;软件的开发与维护的方法不正确&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;软件专业人员错误认识软件开发，忽视软件需求分析，轻视软件维护&lt;/li&gt;
&lt;li&gt;只重视程序而忽视软件配置其余成分。软件由&lt;strong&gt;程序&lt;/strong&gt;、&lt;strong&gt;文档&lt;/strong&gt;、&lt;strong&gt;数据&lt;/strong&gt;组成。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;消除软件危机的途径&lt;a href=&quot;#消除软件危机的途径&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;对计算机软件有一个正确的认识。软件由&lt;strong&gt;程序&lt;/strong&gt;、&lt;strong&gt;相关文档&lt;/strong&gt;、&lt;strong&gt;数据&lt;/strong&gt;组成。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202505132219839.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250513221922796&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推广成功的技术和方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开发和使用更好的软件工具&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;&lt;p&gt;两个方面，技术和管理&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;软件工程的定义&lt;a href=&quot;#软件工程的定义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img202505141633260.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250514163335130&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;本质&lt;a href=&quot;#本质&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;关注大型程序的构造&lt;/li&gt;
&lt;li&gt;中心课题：控制复杂性。管理方面&lt;/li&gt;
&lt;li&gt;软件经常变化。模拟现实，落后现实&lt;/li&gt;
&lt;li&gt;软件开发效率非常重要&lt;/li&gt;
&lt;li&gt;和谐的开发是关键&lt;/li&gt;
&lt;li&gt;必须有效支持它的用户&lt;/li&gt;
&lt;li&gt;在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;基本原理&lt;a href=&quot;#基本原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;分阶段的生命周期计划严格管理&lt;/li&gt;
&lt;li&gt;进行阶段评审&lt;/li&gt;
&lt;li&gt;严格的产品控制&lt;/li&gt;
&lt;li&gt;采用现代程序设计技术&lt;/li&gt;
&lt;li&gt;结果应该被清楚的审查&lt;/li&gt;
&lt;li&gt;开发小组成员少而精&lt;/li&gt;
&lt;li&gt;承认不断改进软件工程实践的必要性&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;软件工程方法学&lt;a href=&quot;#软件工程方法学&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250517143553270.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;三个要素：方法、工具、过程&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h4&gt;传统方法学&lt;a href=&quot;#传统方法学&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;以算法为核心，功能分解&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;也叫做生命周期方法学，采用结构化技术来完成软件开发的各项任务。结构化技术包括结构化分析（SA）、结构化设计（SD）和结构化实现（SP）&lt;/p&gt;&lt;section&gt;&lt;h5&gt;优点&lt;a href=&quot;#优点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;把软件生命周期划分为若干个阶段，每个阶段的任务相对独立且较简单，便于管理以及分工协作&lt;/li&gt;
&lt;li&gt;采用科学的管理技术或良好的技术方法，每个阶段严格审查，提高软件开发的成功率&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;面向对象方法学&lt;a href=&quot;#面向对象方法学&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;以对象为核心，对象分解&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;以数据为主线，把数据和对数据的操作紧密地结合起来的方法&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;软件生命周期&lt;a href=&quot;#软件生命周期&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;从提出开发要求到软件报废的整个时期&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;软件定义
&lt;ul&gt;
&lt;li&gt;问题定义
&lt;ul&gt;
&lt;li&gt;关键是要解决的问题是什么&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可行性研究
&lt;ul&gt;
&lt;li&gt;关键是对于问题定义所确定的问题有行得通的解决办法吗&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;需求分析
&lt;ul&gt;
&lt;li&gt;确定目标系统必须具备的功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;软件开发
&lt;ul&gt;
&lt;li&gt;总体设计
&lt;ul&gt;
&lt;li&gt;概要设计&lt;/li&gt;
&lt;li&gt;确定方案、结构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;详细设计
&lt;ul&gt;
&lt;li&gt;确定算法和数据结构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;编码和单元测试
&lt;ul&gt;
&lt;li&gt;编写易懂、易维护的程序代码&lt;/li&gt;
&lt;li&gt;测试编写出的每一个模块&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;综合测试
&lt;ul&gt;
&lt;li&gt;通过各种类型的测试使软件达到预定的要求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;运行维护
&lt;ul&gt;
&lt;li&gt;交付之后到软件报废的阶段&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;软件过程&lt;a href=&quot;#软件过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;为了获得高质量软件所需要完成的一系列任务的框架，它规定了完成各项任务的工作步骤&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h4&gt;瀑布模型&lt;a href=&quot;#瀑布模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;广泛使用，用于需求明确、完整、无重大变化的软件系统开发，例如操作系统、数据库管理系统、编译系统&lt;/p&gt;&lt;section&gt;&lt;h5&gt;特点&lt;a href=&quot;#特点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;阶段间具有顺序性、依赖性&lt;/li&gt;
&lt;li&gt;尽可能推迟物理实现&lt;/li&gt;
&lt;li&gt;质量保证
&lt;ul&gt;
&lt;li&gt;写文档&lt;/li&gt;
&lt;li&gt;文档写得对&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;优点：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;强迫开发人员采用规范的方法开发&lt;/li&gt;
&lt;li&gt;严格规定了每个阶段必须要提交的文档&lt;/li&gt;
&lt;li&gt;规定所有提交的产品都必须通过质量验证&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;过于理想化，不可能不犯错&lt;/li&gt;
&lt;li&gt;文档驱动的模型，写在纸上的动态说明很难全面正确认识动态的软件产品，可能导致开发的产品不能让用户满意&lt;/li&gt;
&lt;li&gt;灵活性差&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;快速原型模型&lt;a href=&quot;#快速原型模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适用于用户需求不明确，小型或交互型系统开发、大型复杂系统的模型部分、设计一些复杂算法的场合。&lt;/p&gt;&lt;p&gt;快速建立一个能反映用户主要需求的原型系统，让用户试用它，然后记录反馈，快速修改原型系统，迭代多次版本&lt;/p&gt;&lt;section&gt;&lt;h5&gt;优点&lt;a href=&quot;#优点-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;软件开发基本上是线性顺序进行的&lt;/li&gt;
&lt;li&gt;加速开发过程，节约软件开发成本&lt;/li&gt;
&lt;li&gt;获知用户的真正需求&lt;/li&gt;
&lt;li&gt;克服瀑布模型的缺点，减少由于需求不明确带来的开发风险&lt;/li&gt;
&lt;li&gt;吸引用户，快速占领市场&lt;/li&gt;
&lt;li&gt;灵活性强&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;缺点&lt;a href=&quot;#缺点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;选用的开发工具不一定符合主流的发展，小众冷门&lt;/li&gt;
&lt;li&gt;快速建立的系统结构和连续的修改下可能导致产品质量低下&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;增量模型&lt;a href=&quot;#增量模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适用于技术风险较大、用户需求较为稳定的软件系统开发&lt;/p&gt;&lt;p&gt;渐增模型，是瀑布模型的变种&lt;/p&gt;&lt;p&gt;整体设计软件，实践中分阶段做&lt;/p&gt;&lt;section&gt;&lt;h5&gt;优点&lt;a href=&quot;#优点-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;较短时间内向用户提交可完成部分工作的产品&lt;/li&gt;
&lt;li&gt;用户有较充裕的时间学习和适应新产品，减少一个全新软件可能给客户组织带来的冲击&lt;/li&gt;
&lt;li&gt;模型的灵活性可以使其适应需求的变化&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;缺点&lt;a href=&quot;#缺点-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;很容易退化为边做边改模型&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;螺旋模型&lt;a href=&quot;#螺旋模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适用于大型复杂的软件系统开发&lt;/p&gt;&lt;p&gt;瀑布模型+快速原型模型+风险分析&lt;/p&gt;&lt;section&gt;&lt;h5&gt;优点&lt;a href=&quot;#优点-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;对可选方案和约束条件的强调有利于已有软件的重用，也有助于把软件质量作为软件开发的一个重要目标&lt;/li&gt;
&lt;li&gt;减少了过多测试（浪费资金）或测试不足（产品故障多)所带来的风险&lt;/li&gt;
&lt;li&gt;在螺旋模型中维护只是模型的另一个周期，在维护和开发之间并没有本质区别。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;缺点&lt;a href=&quot;#缺点-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;风险驱动，依赖人的水平&lt;/li&gt;
&lt;li&gt;不能让用户确信这种演化方法是可信的&lt;/li&gt;
&lt;li&gt;建设周期长，成本上升&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;喷泉模型&lt;a href=&quot;#喷泉模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适用于面向对象的软件开发过程&lt;/p&gt;&lt;p&gt;在开发的早期阶段定义了一系列面向问题的对象，并且在整个开发过程中不断充实和扩充这些对象&lt;/p&gt;&lt;section&gt;&lt;h5&gt;优点&lt;a href=&quot;#优点-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;可以提高软件项目开发效率，节省开发时间&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;缺点&lt;a href=&quot;#缺点-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;不利于项目管理&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;记忆&lt;a href=&quot;#记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;瀑布模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“瀑布需求少，熟悉环境好；低风险易控，用户参与少。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;快速原型模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“快速原型适应变，原型工具快；成本高领域熟，用户参与多。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;螺旋模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“螺旋大规模，风险控制严；设计灵活准，知识经验全。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阶段化模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“阶段化大项目，结构开放灵；风险难集成，整体性易失。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;喷泉模型&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;​	“喷泉面向对象，用户需求动；阶段无界限，迭代省时间；（过多迭代）成本增提交延。”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img20250603212024628.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250603212017498&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>最长公共子序列</title><link>https://printsdf.dpdns.org/posts/%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97/</guid><description>最长公共子序列</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;题目&lt;a href=&quot;#题目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504281349984.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250428134905645&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;分析&lt;a href=&quot;#分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;f[i][j]f[i][j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;表示&lt;span&gt;&lt;span&gt;AA&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;以&lt;span&gt;&lt;span&gt;ii&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;结尾，&lt;span&gt;&lt;span&gt;BB&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;以&lt;span&gt;&lt;span&gt;jj&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;结尾的公共子序列的集合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果&lt;span&gt;&lt;span&gt;a[i]==b[j]a[i]==b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，那么&lt;span&gt;&lt;span&gt;f[i][j]=f[i−1][j−1]+1f[i][j] = f[i-1][j-1] + 1&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果&lt;span&gt;&lt;span&gt;a[i]!=b[j]a[i] ! = b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]!&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，那么有两种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;a[i]a[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;在最长公共子序列中，&lt;span&gt;&lt;span&gt;b[j]b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;不在 &lt;span&gt;&lt;span&gt;→f[i][j−1]\rightarrow f[i][j-1]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;b[j]b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;在最长公共子序列中，&lt;span&gt;&lt;span&gt;a[i]a[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;不在 &lt;span&gt;&lt;span&gt;→f[i−1][j]\rightarrow f[i-1][j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;a[i]a[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;和&lt;span&gt;&lt;span&gt;b[j]b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;都不在&lt;span&gt;&lt;span&gt;→f[i−1][j−1]\rightarrow f[i-1][j-1]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是&lt;span&gt;&lt;span&gt;f[i][j−1]f[i][j-1]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;表示&lt;span&gt;&lt;span&gt;b[j]b[j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;一定不在，&lt;span&gt;&lt;span&gt;a[i]a[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;可以在，可以不在，所以&lt;span&gt;&lt;span&gt;f[i][j]f[i][j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;包含两个数都不在的情况。同理&lt;span&gt;&lt;span&gt;f[i−1][j]f[i-1][j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;也是，所以我们只需要求这三个表达式的最大值即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n, m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N][N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;scanf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;%s%s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, a &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, b &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; j &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; m; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;[j]) &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[n][m] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>石子合并</title><link>https://printsdf.dpdns.org/posts/%E7%9F%B3%E5%AD%90%E5%90%88%E5%B9%B6/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E7%9F%B3%E5%AD%90%E5%90%88%E5%B9%B6/</guid><description>石子合并</description><pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;题目描述&lt;a href=&quot;#题目描述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504272050023.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250427205036779&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入格式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;第一行一个数 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 表示石子的堆数 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;第二行 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个数，表示每堆石子的质量(均不超过1000)。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输出格式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出一个整数，表示最小代价。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据范围&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1≤&lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;≤300&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1 3 5 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;输出样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;分析&lt;a href=&quot;#分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504272101321.jpg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;8a64f74c321debf7f9807b3e412d601&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;合并的代价其实就是&lt;span&gt;&lt;span&gt;[i,j][i, j]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;的价值的总和，所以可以使用前缀和&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;区间DP一般都是两层循环，外层&lt;code&gt;len&lt;/code&gt;，内层起点&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;310&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N][N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; ) cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[i], &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;; len &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; len &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; k &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; i; k &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; j; k &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;min&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][k] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[k &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[j] &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][n] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>背包问题</title><link>https://printsdf.dpdns.org/posts/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/</guid><description>背包问题</description><pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;01背包&lt;a href=&quot;#01背包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;题目描述&lt;a href=&quot;#题目描述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504272217408.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250427221733213&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入样例&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4 5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2 4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3 4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4 5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;输出样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;分析&lt;a href=&quot;#分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504272229211.jpg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;d6ff6b08f112cec54b1101aecc6d5c7&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第一版&lt;a href=&quot;#第一版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n, m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N][N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )   cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; j &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; m; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (j &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i]] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[n][m] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;但是由于&lt;code&gt;f[i][j]&lt;/code&gt;的状态转移方程都是由&lt;code&gt;[i-1]&lt;/code&gt;层决定，所以第一维实际上可以省略。但是省略之后需要将j倒过来遍历，因为没有降维之前状态转移方程为：&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;f[i][j]=max(f[i−1][j],f[i−1][j−v[i]]+w[i])f[i][j] = max(f[i-1][j], f[i-1][j-v[i]]+w[i])&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;我们需要使用到前一层的&lt;span&gt;&lt;span&gt;j−v[i]j-v[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，所以要保证此时的&lt;span&gt;&lt;span&gt;j−v[i]j-v[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;仍然是上一层计算出来的值，而不是&lt;span&gt;&lt;span&gt;f[i][j−v[i]]f[i][j-v[i]]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，又因为&lt;span&gt;&lt;span&gt;j−v[i]j-v[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;小于&lt;span&gt;&lt;span&gt;jj&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，所以只能倒序才能让&lt;span&gt;&lt;span&gt;j−v[i]j-v[i]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;在&lt;span&gt;&lt;span&gt;jj&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;之后更新。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二版&lt;a href=&quot;#第二版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n, m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )   cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; m; j &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i]; j &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i]] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[m] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;完全背包&lt;a href=&quot;#完全背包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504272243690.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250427224301479&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入样例&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4 5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2 4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3 4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4 5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;输出样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;分析&lt;a href=&quot;#分析-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;由于物品可以选无数个，所以我们可以从&lt;span&gt;&lt;span&gt;00&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;~&lt;span&gt;&lt;span&gt;kk&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;个不断尝试，找到最大的价值。&lt;/p&gt;&lt;p&gt;可以写出状态转移方程:&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;f[i][j]=max{f[i−1][j−k∗v[i]]+k∗w[i]}f[i][j] = max\{f[i - 1][j - k * v[i]] + k * w[i]\}\\&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;我们还观察到:&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;f[i][j]=max(f[i−1][j],f[i−1][j−v[i]],⋯ ,f[i−1][j−k∗v[i]]+w[i]∗k)f[i][j−v[i]]=max(f[i−1][j−v[i]],⋯ ,f[i−1][j−k∗v[i]]+w[i]∗k)f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]], \cdots,f[i-1][j-k*v[i]]+w[i]*k)\\
f[i][j-v[i]] = max(f[i-1][j-v[i]],\cdots,f[i-1][j-k*v[i]]+w[i]*k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋯&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋯&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∗&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;所以&lt;span&gt;&lt;span&gt;f[i][j]=max(f[i−1][j],f[i][j−v[i]])f[i][j] = max(f[i-1][j], f[i][j-v[i]])&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n, m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )  cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i]; j &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; m; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;[i]] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[m] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;多重背包&lt;a href=&quot;#多重背包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;基础&lt;a href=&quot;#基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;数据范围小，普通DP即可&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;分组背包&lt;a href=&quot;#分组背包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;</content:encoded></item><item><title>值函数近似</title><link>https://printsdf.dpdns.org/posts/%E5%80%BC%E5%87%BD%E6%95%B0%E8%BF%91%E4%BC%BC/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%80%BC%E5%87%BD%E6%95%B0%E8%BF%91%E4%BC%BC/</guid><description>值函数近似</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;tabular -&amp;gt; function&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;我们需要找到一个最优的&lt;span&gt;&lt;span&gt;ww&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;使得&lt;span&gt;&lt;span&gt;v^(s,w)\hat{v}(s, w)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;近似&lt;span&gt;&lt;span&gt;vπ(s)v_\pi(s)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;​​&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504172220599.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417222051465&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;ΦT(s)\Phi ^T(s)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Φ&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;是特征向量，&lt;span&gt;&lt;span&gt;ww&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;是参数向量&lt;/p&gt;
&lt;p&gt;或者神经网络&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Objective function&lt;a href=&quot;#objective-function&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504172132862.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417213239736&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Stationary distribution&lt;a href=&quot;#stationary-distribution&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;ss&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;为随机变量，符合概率分布，若为均匀分布，实际上是不太好的，重要的状态喝不重要的状态被视为一致的。&lt;/p&gt;&lt;p&gt;所以我们引入stationary distribution，其中&lt;span&gt;&lt;span&gt;dπTd_\pi^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;可以用下面这个公式求出，&lt;span&gt;&lt;span&gt;PπP_\pi&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;为转移矩阵，我们知道，到平稳状态时，概率分布会收敛，所以等式左右两边的值是一致的，由此可以解出&lt;span&gt;&lt;span&gt;dπTd_\pi^T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504172135476.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417213549405&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504172136574.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417213620429&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Optimization algorithm&lt;a href=&quot;#optimization-algorithm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;梯度下降&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;wk+1=wk−αk∇wJ(wk)w_{k+1} = w_k - \alpha_k\nabla_wJ(w_k)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;α&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∇&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;J&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h4&gt;true gradient&lt;a href=&quot;#true-gradient&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∇w(Jw)=−2E[(vπ(S)−v^(S,w)∇wv^(S,w))]\nabla_w(J_w) = -2\mathbb E[(v_\pi(S)-\hat v(S, w)\nabla_w\hat v(S, w))]&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∇&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;J&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;[(&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;∇&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;))]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;这个式子有期望，所以我们用stochastic gradient代替true gradient，&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504172213956.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417221313827&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;vπ(st)v_\pi(s_t)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;未知&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250417221514945&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;其中，函数&lt;span&gt;&lt;span&gt;v^(s,w)\hat v(s,w)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;是由我们自己定义的&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504221055188.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250422105455972&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;线性方程 拟合  缺点：特征方程不好选&lt;/li&gt;
&lt;li&gt;非线性 神经网络 DQN&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果是线性方程，就被叫做TD-linear&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>最长上升子序列题解</title><link>https://printsdf.dpdns.org/posts/%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97%E9%A2%98%E8%A7%A3/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97%E9%A2%98%E8%A7%A3/</guid><description>最长上升子序列题解</description><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;1. base&lt;a href=&quot;#1-base&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;这是一个线性dp的版本，它的数据范围在1000&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;给定一个长度为 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;的数列，求数值严格单调递增的子序列的长度最长是多少。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入格式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;第一行包含整数 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;第二行包含 &lt;span&gt;&lt;span&gt;NN&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个整数，表示完整序列。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输出格式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出一个整数，表示最大长度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据范围&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;1≤N≤10001≤N≤1000&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，
&lt;span&gt;&lt;span&gt;−109≤数列中的数≤109−10^9≤数列中的数≤10^9&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;数列中的数&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;输入样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3 1 2 1 8 5 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;输出样例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;DP分析&lt;a href=&quot;#dp分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504221017840.jpg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;23558fd23229a69e3a50d02b8e8ac61&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )  cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; j &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; i; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[j])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[j] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(res, &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 进阶&lt;a href=&quot;#2-进阶&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;数据范围更大，使用DP会TLE(Time Limit Error)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;数据范围&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;1≤N≤10000001≤N≤1000000&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1000000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，
&lt;span&gt;&lt;span&gt;−109≤数列中的数≤109−10^9≤数列中的数≤10^9&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;数列中的数&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≤&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;​&lt;/p&gt;&lt;section&gt;&lt;h3&gt;分析&lt;a href=&quot;#分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;存储每个长度中最后的数最小的情况，必定这个数组是单调递增的，可以用二分。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;代码&lt;a href=&quot;#代码-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[N], &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )  cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; l &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, r &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; len;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (l &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; r)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; mid &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; l &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; r &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;[mid] &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[i])  l &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; mid;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; r &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; mid &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(len, r &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;[r &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>model free and model based</title><link>https://printsdf.dpdns.org/posts/model-free-and-model-based/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/model-free-and-model-based/</guid><description>model free and model based</description><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;model-based事实上就是模型已知，model-free是模型未知，事实上，在研究最优控制问题中，通过model-based求得最优解然后验证model-free的方法求得的最优解是否正确。&lt;/p&gt;</content:encoded></item><item><title>数字三角形</title><link>https://printsdf.dpdns.org/posts/%E6%95%B0%E5%AD%97%E4%B8%89%E8%A7%92%E5%BD%A2/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E6%95%B0%E5%AD%97%E4%B8%89%E8%A7%92%E5%BD%A2/</guid><description>数字三角形</description><pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504152228178.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;题目&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;分析&lt;a href=&quot;#分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504161026850.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250416102612521&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[N][N], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[N][N];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; j &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; i; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[i][j];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )  &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[n][i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span&gt;[n][i];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; j &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; j &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; i; j &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i][j] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j], &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[i &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][j &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )  res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(res, &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;[n][i]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>TD learning</title><link>https://printsdf.dpdns.org/posts/td-learning/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/td-learning/</guid><description>TD learning</description><pubDate>Sun, 13 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;TD learning of state values&lt;a href=&quot;#td-learning-of-state-values&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;只能估计给定策略&lt;span&gt;&lt;span&gt;π\pi&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;的state value&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504141601720.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250414160137501&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Sarsa&lt;a href=&quot;#sarsa&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;给定策略可以估计action value&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Sarsa is an action-value version of the TD algorithm&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504141940441.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250414194020139&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;expected Sarsa&lt;a href=&quot;#expected-sarsa&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504152132101.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250415213231678&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504152141788.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250415214119677&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;n-step Sarsa&lt;a href=&quot;#n-step-sarsa&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;包含MC&amp;amp;&amp;amp;TD&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504152145161.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250415214523965&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q-learning&lt;a href=&quot;#q-learning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504161004770.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250416100428680&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Summary&lt;a href=&quot;#summary&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504161003868.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250416100310699&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>交替放置的玻璃杯题解</title><link>https://printsdf.dpdns.org/posts/%E4%BA%A4%E6%9B%BF%E6%94%BE%E7%BD%AE%E7%9A%84%E7%8E%BB%E7%92%83%E6%9D%AF%E9%A2%98%E8%A7%A3/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E4%BA%A4%E6%9B%BF%E6%94%BE%E7%BD%AE%E7%9A%84%E7%8E%BB%E7%92%83%E6%9D%AF%E9%A2%98%E8%A7%A3/</guid><description>交替放置的玻璃杯题解</description><pubDate>Sun, 13 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;&lt;strong&gt;题目1: 交替放置的玻璃杯&lt;/strong&gt;&lt;a href=&quot;#题目1-交替放置的玻璃杯&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;有2n个玻璃杯挨个排成一排，前n个装满苏打水，其余n个杯子为空。交换杯子的位置，使之按照满—空—满—空的模式排列，而且杯子移动的次数要最少&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/printsdf/img/20250413121214.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;这道题目不在力扣里哦，提示：用分治法求解。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;题目理解&lt;a href=&quot;#题目理解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504131355453.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250413135538159&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我们可以发现：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;目标状态的下标存在规律
&lt;ul&gt;
&lt;li&gt;杯满为偶数，杯空为奇数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;要达到目标状态，只需要交换绿色线连着的两个杯子&lt;/li&gt;
&lt;li&gt;两端的杯子必定在正确的位置，从1和&lt;span&gt;&lt;span&gt;2n−22n-2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;​开始，每隔一个杯子就不在正确的位置&lt;/li&gt;
&lt;li&gt;最少的交换次数为&lt;span&gt;&lt;span&gt;⌊n/2⌋\lfloor n/2 \rfloor&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⌊&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;/2&lt;/span&gt;&lt;span&gt;⌋&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Method 1 双指针&lt;a href=&quot;#method-1-双指针&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;使用左右指针分别从两边向中间逼近，交换杯子&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h4&gt;伪代码&lt;a href=&quot;#伪代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 初始化l=1, r=2n-2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 不断循环交换杯子，记录交换次数，l+=2,r+=2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. return 交换次数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;时空复杂度分析&lt;a href=&quot;#时空复杂度分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;时间复杂度：实际上两个指针相遇即可退出循环，循环次数为&lt;span&gt;&lt;span&gt;n/2n/2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;/2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，所以时间复杂度为&lt;span&gt;&lt;span&gt;O(n)O(n)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空间复杂度：只需维护一个string数组，大小为&lt;span&gt;&lt;span&gt;2n2n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，所以空间复杂度也为&lt;span&gt;&lt;span&gt;O(n)O(n)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;代码&lt;a href=&quot;#代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;string &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;span&gt;// full的index应该为偶数，empty的index应该为奇数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap_cups&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; l &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, r &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (l &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; r &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; n)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;swap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[l], &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[r]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;l &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, r &lt;/span&gt;&lt;span&gt;-=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;res &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; ;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; res;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; res;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )   &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;full&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;empty&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap_cups&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot; &quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Method 2 分治&lt;a href=&quot;#method-2-分治&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;base case&lt;a href=&quot;#base-case&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;n = 1时自动满足满-空&lt;/li&gt;
&lt;li&gt;n = 2时只需交换中间两个杯子&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;general&lt;a href=&quot;#general&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504131355453.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250413135538159&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;T(n)={0n=01n=1T(n−2)+1n≥2T(n) = \begin{cases}
0 &amp;amp; n = 0\\
1 &amp;amp; n = 1\\
T(n - 2)+1 &amp;amp; n \geq 2
\end{cases}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;⎩&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;⎨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;⎧&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≥&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;时空复杂度分析&lt;a href=&quot;#时空复杂度分析-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;时间复杂度：&lt;span&gt;&lt;span&gt;O(n)O(n)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;空间复杂度：&lt;span&gt;&lt;span&gt;O(n)O(n)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;代码&lt;a href=&quot;#代码-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; N &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20010&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;string &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[N];&lt;/span&gt;&lt;span&gt;// full的index应该为偶数，empty的index应该为奇数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap_cups_divide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (l &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; r) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;swap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[l], &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[r]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap_cups_divide&lt;/span&gt;&lt;span&gt;(l &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, r &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; res;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cin &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; n;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )   &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;full&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;empty&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap_cups_divide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; res &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; endl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; n; i &lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cups&lt;/span&gt;&lt;span&gt;[i] &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot; &quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>SGD</title><link>https://printsdf.dpdns.org/posts/sgd/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/sgd/</guid><description>SGD</description><pubDate>Sat, 12 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;GD&lt;a href=&quot;#gd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504141352054.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250414135236982&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;BGD&lt;a href=&quot;#bgd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504141350644.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250414135057529&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;MBGD&lt;a href=&quot;#mbgd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;每次取m个数据&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504131920237.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;SGD&lt;a href=&quot;#sgd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504140953472.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250414095338304&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;Summary&lt;a href=&quot;#summary&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://img.printsdf.dpdns.org/img/main/img/202504132137089.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;image-20250413213742809&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>图片如何处理</title><link>https://printsdf.dpdns.org/posts/%E5%9B%BE%E7%89%87%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/%E5%9B%BE%E7%89%87%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86/</guid><description>图片如何处理</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;图片如何处理&lt;a href=&quot;#图片如何处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;使用&lt;code&gt;ppt&lt;/code&gt;把图片转换为pdf，然后使用&lt;code&gt;inkscape&lt;/code&gt;将多余的空白去除，快捷键是&lt;code&gt;Ctrl+Shift+R&lt;/code&gt;，之后导出为&lt;code&gt;png&lt;/code&gt;，&lt;code&gt;dpi&lt;/code&gt;设置为300。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>MDX 格式文章示例</title><link>https://printsdf.dpdns.org/posts/mdx-example/</link><guid isPermaLink="true">https://printsdf.dpdns.org/posts/mdx-example/</guid><description>这是一个 MDX 格式的示例文章，展示了如何在 Markdown 中使用 JSX。</description><pubDate>Fri, 02 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Tip&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot;&gt;Firefly&lt;/a&gt; 支持 &lt;code&gt;MDX&lt;/code&gt; 和 &lt;code&gt;Markdown&lt;/code&gt; 两种类型的文章，你可以在文章中混合使用两种格式，如果没有特别复杂内容和需求，推荐使用 Markdown 格式就够了。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;Markdown 和 MDX 的区别&lt;a href=&quot;#markdown-和-mdx-的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Markdown (MD) 是一种轻量级标记语言，允许用户使用纯文本格式编写文档，然后将其转换为格式化的HTML。它因其简洁易用的语法而广受欢迎，特别适合编写文档和博客文章。&lt;/li&gt;
&lt;li&gt;MDX 是一种扩展了 Markdown 语法的格式，允许在 Markdown 文档中无缝地插入 JSX 代码。通过 MDX，用户可以在文档中嵌入 React 组件，从而实现更丰富的交互性和动态性。&lt;/li&gt;
&lt;/ul&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;/th&gt;&lt;th&gt;Markdown&lt;/th&gt;&lt;th&gt;MDX&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;基础语法&lt;/td&gt;&lt;td&gt;支持 (CommonMark)&lt;/td&gt;&lt;td&gt;支持 (CommonMark)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTML 标签&lt;/td&gt;&lt;td&gt;支持&lt;/td&gt;&lt;td&gt;支持 (作为 JSX)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;组件导入&lt;/td&gt;&lt;td&gt;不支持&lt;/td&gt;&lt;td&gt;支持 (import)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;动态数据&lt;/td&gt;&lt;td&gt;不支持&lt;/td&gt;&lt;td&gt;支持 (JS 表达式)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;样式定制&lt;/td&gt;&lt;td&gt;有限 (class/style)&lt;/td&gt;&lt;td&gt;灵活 (className/CSS-in-JS)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用组件&lt;a href=&quot;#使用组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是一个图标组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Icon } from &apos;astro-icon/components&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div class=&quot;flex items-center gap-2 my-4&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Icon name=&quot;fa6-solid:rocket&quot; class=&quot;text-4xl text-red-500&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;span&amp;gt;火箭发射！&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;     &lt;span&gt;火箭发射！&lt;/span&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 JSX&lt;a href=&quot;#使用-jsx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你也可以直接写 HTML/JSX：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div className=&quot;p-4 bg-blue-100 dark:bg-blue-900 rounded-lg my-4&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;这是一个自定义样式的 div 块，使用了 Tailwind CSS 类。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;这是一个自定义样式的 div 块，使用了 Tailwind CSS 类。&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;简单的变量导出&lt;a href=&quot;#简单的变量导出&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const year = new Date().getFullYear()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;今年是 {year} 年。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;今年是 2026 年。&lt;/p&gt;&lt;p&gt;更多信息，请查看 &lt;a href=&quot;https://mdxjs.com/&quot;&gt;MDX 文档&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>