<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>好的好的378的博客</title>
  
  
  <link href="https://college-github-io.pages.dev/atom.xml" rel="self"/>
  
  <link href="https://college-github-io.pages.dev/"/>
  <updated>2026-07-23T08:46:30.447Z</updated>
  <id>https://college-github-io.pages.dev/</id>
  
  <author>
    <name>wqt</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>在树莓派终端前，才发现自己并不真的会写代码</title>
    <link href="https://college-github-io.pages.dev/posts/5afce479/"/>
    <id>https://college-github-io.pages.dev/posts/5afce479/</id>
    <published>2026-07-23T12:00:00.000Z</published>
    <updated>2026-07-23T08:46:30.447Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>当项目一直在 Build，而我很少 Review，也很少真正 Coding。</p></blockquote><p>最近在玩树莓派时，我尝试做了一件现在看来很普通、对我来说却有些陌生的事情：不用 AI 生成代码，也不开代码补全，只在终端里用 <code>vi</code> 和 <code>nano</code> 编辑文件，再分别用 Python、<code>gcc</code> 和 <code>javac</code> 运行或编译程序。</p><p>面对一个几乎空白的文件，我原本以为自己很快就能写完。真正动手以后，我才发现事情并没有想象中顺利。</p><p>写 C 语言输入时，我一时想不起 <code>scanf(&quot;%d&quot;, &amp;a);</code> 为什么需要取地址符 <code>&amp;</code>；定义函数时，也会短暂忘记形参前必须写类型。换到 Python，又需要重新确认 <code>input()</code> 返回的是字符串，如果要读取整数，还得写成 <code>int(input())</code>。Java 的 <code>Scanner</code>、类名、入口方法和各种括号，也不再像以前那样自然地从手指里流出来。</p><p>这些语法并不难，查一下文档也很正常。真正让我不安的不是忘记某个符号，而是我已经很久没有独立面对一个空白文件了。</p><span id="more"></span><h2 id="离开-ai-以后-我还剩下多少能力">离开 AI 以后，我还剩下多少能力</h2><p>过去一段时间，我做过不少项目。</p><p>我搭建过 Hexo 博客，接触过 Claude Code、Codex、OpenClaw，也尝试过各种 AI 项目和自动化工具。一个需求交给 AI，几分钟后就能看到目录结构；继续对话，页面、接口、配置和部署脚本也会逐渐出现。从结果上看，我好像一直在写代码，也一直在完成项目。</p><p>但站在树莓派终端前，我忽然开始怀疑：这些项目里，究竟有多少代码是我真正亲手写过、认真理解过的？</p><p>如果只计算那些不依赖生成、能够解释每一个关键步骤、出现问题后也能独立修改的代码，我真正写过的有效代码，也许只有一千多行。</p><p>项目数量给了我一种一直在进步的感觉，空白文件却揭穿了这种熟练感。</p><p>“做过项目”和“拥有项目中的能力”，原来是两回事。</p><h2 id="项目一直在-build-但我没有跟着成长">项目一直在 Build，但我没有跟着成长</h2><p>AI Coding 很容易让人进入一种循环：提出需求，等待生成，执行 Build，把报错发回去，再等待下一次修改。</p><p>如果运行成功，就继续增加功能；如果运行失败，就把错误信息交给模型。项目在这个循环中变得越来越完整，代码量也越来越多，但我很少停下来认真阅读一次 diff，很少顺着调用链理解数据怎样流动，也很少检查异常处理是否可靠。</p><p>我一直在 Build，却没有认真 Review；一直在催促项目向前，却很少真正 Coding。</p><p>更严重的是，我已经很久没有进入过去那种写代码的状态了。不是不断告诉模型“继续”“修复”“再加一个功能”，也不是盯着构建日志等待结果，而是停在一个模块前，认真考虑数据应该怎样组织、接口为什么这样设计、错误应该在哪里处理。</p><p>那种过程很慢，有时一个问题需要想很久，却会形成真正属于自己的理解。AI 缩短了实现时间，也让我越来越少经历这段缓慢但重要的思考。</p><p>项目越来越多，真正沉淀下来的设计经验却没有同步增加。</p><h2 id="100-由-ai-开发-还能证明什么">“100% 由 AI 开发”还能证明什么</h2><p>现在很多项目会特意强调：“这个项目由 AI 完成。”</p><p>但当任何人都能通过对话迅速得到一个像样的 Demo，这句话越来越难证明一个人的能力。AI 参与了多少并不重要，真正值得追问的是：问题是谁发现的，方案是谁决定的，生成结果有没有被认真审查，系统出错时又有谁能够接住。</p><p>一个项目可以完全由 AI 生成，但项目产生的判断、经验和能力，不会因此自动属于我。</p><p>过去，独立做出一个网站、写完一个程序或者完成一个可运行的系统，本身就是一件值得骄傲的事情。现在，实现的门槛正在快速降低。曾经能够带来成就感的结果，正在变成每个人都能获得的普通产物。</p><p>这并不意味着做项目失去了价值，而是项目的价值不再只由“有没有做出来”决定。</p><p>当生成变得廉价，理解、判断、验证和责任反而变得更重要。</p><h2 id="几小时完成的课程设计-可能什么也没有留下">几小时完成的课程设计，可能什么也没有留下</h2><p>这种问题在课程设计里更加明显。</p><p>过去可能需要几周完成的任务，现在把要求交给 AI，几个小时就能生成代码、报告、运行截图，甚至连答辩稿都可以一起准备好。从提交结果来看，任务完成得更快，页面也可能比以前更漂亮。</p><p>但课程设计原本是为了什么？</p><p>它应该迫使我把专业课中的概念真正用一次：选择数据结构，理解网络通信过程，设计串口收发流程，观察协议字段，定位异常，处理边界情况。</p><p>如果这些步骤全部被 AI 代替，我得到的只是一个可以提交的文件夹。代码运行了，报告写完了，分数也许不会低，但专业知识并没有因此留在我的脑子里。</p><p>任务被完成，不等于学习发生过。</p><p>更讽刺的是，AI 节省下来的时间，我未必真的用来理解知识。很多时候，我只是更快地完成这一个任务，然后马上开始下一个任务。效率提高了，欠下的理解却越来越多。</p><h2 id="被掏空的不只是语法">被掏空的不只是语法</h2><p>树莓派上的几行代码让我回头看了看学过的课程。</p><p>计算机组成原理、计算机网络、串口通信、协议分析……这些内容我都学过，也参加过考试。但如果现在真的遇到通信失败，我能不能从电平、波特率、数据帧、字节序一路排查？遇到网络异常，我能不能独立抓包，理解报文，再定位是哪一层出了问题？</p><p>很多知识在我的记忆里只剩下“好像见过”。</p><p>语法忘记了还可以查，真正危险的是基础知识没有形成可以调用的能力。没有这些基础，即使 AI 给出了一份看起来正确的代码，我也很难判断它是否真的可靠，更不知道问题发生时应该从哪里开始检查。</p><p>AI 并没有让基础知识失去价值。恰恰相反，生成能力越强，审查生成结果所需要的基础就越重要。</p><h2 id="这种效率-究竟是不是我的">这种效率，究竟是不是我的</h2><p>还有一种焦虑来自工具本身。</p><p>我现在可以使用一些非常先进的模型，它们能够快速理解项目、修改多个文件、运行命令并修复错误。但这些能力建立在一个前提上：服务始终可以访问，账号仍然有效，价格和使用条件没有发生无法承受的变化。</p><p>今天能够使用的模型，明天未必还能以同样的渠道、成本和条件继续使用。</p><p>如果我的效率完全建立在某个外部服务始终可用的前提上，那么这种效率并不真正属于我，它更像是一种暂时租来的能力。一旦模型不可用、额度耗尽或者网络中断，我是否还能继续工作，才真正暴露了自己的能力边界。</p><p>最危险的不是 AI 突然消失，而是它没有消失的时候，我已经把它的能力误认为了自己的能力。</p><h2 id="ai-可以替我提高速度-但不能替我形成能力">AI 可以替我提高速度，但不能替我形成能力</h2><p>写到这里，我并不想得出“以后不要使用 AI”的结论。</p><p>拒绝 AI 并不会自动让人变强。相反，合理使用 AI 可以降低试错成本，帮助我更快接触陌生技术，也能把时间从重复劳动中释放出来。问题从来不是用不用，而是我把什么交给了它。</p><p>AI 可以替我提高速度，但不能替我形成能力。</p><p>真正危险的不是使用 AI，而是在没有理解、没有验证、没有复盘的情况下，把思考也一起外包。</p><p>如果我只要求 AI 给出结果，却不再理解过程，那么每一次看似成功的交付，都可能进一步掏空自己的能力。久而久之，我拥有的不是技术，只是一套不断向模型提要求的操作习惯。</p><h2 id="写在最后">写在最后</h2><p>树莓派终端里的那个空白文件，没有证明我不适合写代码，却提醒我重新审视自己正在成为怎样的开发者。</p><p>项目完成得越来越快，不代表我理解得越来越深；代码生成得越来越多，也不代表其中有更多东西真正属于我。</p><p>以后，当我再次说“这个项目是我做的”时，我希望自己不只是能够打开页面、展示功能和介绍用了哪个模型。</p><p>我还应该能够解释它为什么这样设计，能够在没有 AI 立即给出答案时继续思考，能够发现生成代码中的问题，也能够在系统真正出错时承担修复它的责任。</p><p>否则，我拥有的可能不是一个项目，只是一次成功的生成记录。</p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;当项目一直在 Build，而我很少 Review，也很少真正 Coding。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近在玩树莓派时，我尝试做了一件现在看来很普通、对我来说却有些陌生的事情：不用 AI 生成代码，也不开代码补全，只在终端里用 &lt;code&gt;vi&lt;/code&gt; 和 &lt;code&gt;nano&lt;/code&gt; 编辑文件，再分别用 Python、&lt;code&gt;gcc&lt;/code&gt; 和 &lt;code&gt;javac&lt;/code&gt; 运行或编译程序。&lt;/p&gt;
&lt;p&gt;面对一个几乎空白的文件，我原本以为自己很快就能写完。真正动手以后，我才发现事情并没有想象中顺利。&lt;/p&gt;
&lt;p&gt;写 C 语言输入时，我一时想不起 &lt;code&gt;scanf(&amp;quot;%d&amp;quot;, &amp;amp;a);&lt;/code&gt; 为什么需要取地址符 &lt;code&gt;&amp;amp;&lt;/code&gt;；定义函数时，也会短暂忘记形参前必须写类型。换到 Python，又需要重新确认 &lt;code&gt;input()&lt;/code&gt; 返回的是字符串，如果要读取整数，还得写成 &lt;code&gt;int(input())&lt;/code&gt;。Java 的 &lt;code&gt;Scanner&lt;/code&gt;、类名、入口方法和各种括号，也不再像以前那样自然地从手指里流出来。&lt;/p&gt;
&lt;p&gt;这些语法并不难，查一下文档也很正常。真正让我不安的不是忘记某个符号，而是我已经很久没有独立面对一个空白文件了。&lt;/p&gt;</summary>
    
    
    
    <category term="AI思考" scheme="https://college-github-io.pages.dev/categories/AI%E6%80%9D%E8%80%83/"/>
    
    
    <category term="AI" scheme="https://college-github-io.pages.dev/tags/AI/"/>
    
    <category term="AI Coding" scheme="https://college-github-io.pages.dev/tags/AI-Coding/"/>
    
    <category term="编程基础" scheme="https://college-github-io.pages.dev/tags/%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/"/>
    
    <category term="大学生" scheme="https://college-github-io.pages.dev/tags/%E5%A4%A7%E5%AD%A6%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>深圳不止有大厂，还有多座向往的大学</title>
    <link href="https://college-github-io.pages.dev/posts/7cf27537/"/>
    <id>https://college-github-io.pages.dev/posts/7cf27537/</id>
    <published>2026-07-22T12:00:00.000Z</published>
    <updated>2026-07-23T08:47:29.367Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>香港中文大学（深圳） · 南方科技大学 · 深圳大学城参观记录</p></blockquote><p>很多人提到深圳，第一反应都是腾讯、华为、大疆、比亚迪这些科技公司。而这次来到深圳，我发现支撑这座城市持续创新的，除了企业，还有一批同样优秀的大学。</p><p>前几天，我花了一天时间，先后参观了香港中文大学（深圳）、南方科技大学以及深圳大学城。离开的时候，我最大的感受并不是“校园很漂亮”，而是第一次真正理解了深圳为什么能够成为中国科技创新最活跃的城市之一。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222019857.jpg" alt="香港中文大学（深圳）校园入口"></p><span id="more"></span><h2 id="港中深：第一次有了-国外大学-的感觉">港中深：第一次有了“国外大学”的感觉</h2><p>在网上，我看过很多国外大学的视频。</p><p>大片的草坪、现代化的建筑、开放式校园，还有学生自由交流和学习的氛围。以前总觉得这些离自己很远，直到真正走进香港中文大学（深圳），这种感觉第一次出现在现实里。</p><p>校园建筑大量采用玻璃幕墙和现代设计语言。与印象中教学楼密集排列的传统校园相比，这里更强调空间感和开放性。站在宽阔的广场上，看着建筑与绿地自然连接，我终于理解为什么很多人说港中深“不像一所传统意义上的国内大学”。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020232.jpg" alt="香港中文大学（深圳）的建筑与荷塘"></p><p>让我印象更深的是这里的书院制度。</p><p>学生不仅属于学院，也分别属于不同的书院。书院更像一个共同生活和成长的社区，会组织各种活动，也为不同专业、年级和文化背景的学生提供交流空间。部分书院以捐赠者或重要教育人物命名。这种制度让我第一次意识到，大学除了课堂之外，也在尝试建设一种真正属于学生的校园文化。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020233.jpg" alt="荷塘与校园步道"></p><p>港中深的国际化不仅体现在建筑上，也体现在师资、课程体系和校园氛围中。</p><p>虽然我未来并没有继续走科研路线的打算，但我能明显感受到，这样的环境能让学生拥有更广阔的视野，也有更多机会接触国际交流与产业资源。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020234.jpg" alt="开放式校园空间"></p><h2 id="南科大：让我更有代入感的一所学校">南科大：让我更有代入感的一所学校</h2><p>相比港中深，南方科技大学给我的感觉更接近一所充满工程气息的大学。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020235.jpg" alt="南方科技大学校名与草坪"></p><p>校园很大，很多学生骑着电瓶车穿梭在教学楼之间，游泳馆、体育馆、实验楼等配套设施也十分完善。</p><p>这里最吸引我的不是建筑，而是那种“做事情”的氛围。</p><p>南科大以理、工、医为主，同时布局商科、特色人文社科以及新兴交叉学科。走在校园里，最容易注意到的是一栋栋科研楼。以前我总觉得科研离本科生很远，但后来发现，这些实验平台并不仅仅意味着论文和实验，也可能连接着项目、竞赛、校企合作以及工程实践。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020236.jpg" alt="南方科技大学教学楼与校园道路"></p><p>我其实并不是一个特别喜欢科研的人。相比写论文，我更喜欢做项目。</p><p>从大一接触 AI 工具开始，到后来学习 Claude Code、Codex、OpenClaw，再到自己搭建 Hexo 博客，我逐渐发现，自己真正感兴趣的是把一个想法变成一个可以运行、可以被别人使用的东西。</p><p>所以相比实验室本身，我更关注的是学校能为学生提供多少实践平台、工程训练和接触真实产业需求的机会。南科大的校园环境让我看到了更多这样的可能。</p><h2 id="深圳大学城：大学不是孤立存在的">深圳大学城：大学不是孤立存在的</h2><p>来到深圳大学城之后，我突然理解了一件事情：深圳的大学并不是各自独立发展，而是共同组成了一张人才培养与技术创新的网络。</p><p>这里汇聚了清华大学深圳国际研究生院、北京大学深圳研究生院、哈尔滨工业大学（深圳）等高校。在深圳的其他区域，还有更多高校、研究院、实验室和企业研发中心。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020237.jpg" alt="清华大学深圳国际研究生院"></p><p>一路上，我发现很多学校距离科技园区并不遥远。实验室、创业公司和大型科技企业分布在同一座城市里，彼此之间的距离很近。</p><p>对于学生来说，这意味着课堂之外，还有机会接触真实的产业环境。一个项目可能从课堂里的想法开始，经过实验室和工程实践，最后回应企业或社会中的实际需求。</p><p>我觉得，这也是深圳和很多城市最大的不同。</p><p><img src="https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222020238.jpg" alt="哈尔滨工业大学（深圳）校园"></p><h2 id="深圳真正吸引我的-不是高楼-而是科技生态">深圳真正吸引我的，不是高楼，而是科技生态</h2><p>参观结束以后，我没有一直去想哪所学校排名更高，反而一直在想另一件事情：为什么越来越多优秀的人愿意来到深圳？</p><p>后来我觉得，答案可能并不仅仅是工资。</p><p>这里有高校，有企业，有创业团队，有技术社区，也有各种新技术不断落地。</p><p>AI、机器人、自动驾驶、智能制造……很多以前只能在新闻里看到的新技术，在深圳都有机会真正参与其中。</p><p>对于一个工科学生来说，这种环境本身就是一种吸引力。因为在这里，学习的不只是知识，还能不断接触真实项目、真实需求和真实产业。</p><h2 id="写在最后">写在最后</h2><p>这次深圳之行，更像是一次提前体验未来。</p><p>以前我更多关注的是学校排名和专业实力，而现在，我开始关注另一件事情：</p><p><strong>这所学校能不能让我成长？</strong></p><p>成长不仅意味着课程，也意味着项目、实践、企业资源以及身边的人。</p><p>作为一名网络工程专业的学生，我未来更希望走工程实践方向，而不是科研路线。我希望能够参与更多真正落地的项目，把技术变成产品，把想法变成现实。</p><p>也许未来我不会留在实验室，但我希望能够进入一家优秀的科技企业，参与软件开发、AI 应用、网络基础设施或者智能制造相关工作。</p><p>深圳让我看到，这样的目标并不是一句口号。</p><p>这里有大学，也有产业；有学习，也有实践；有梦想，也有把梦想变成现实的机会。</p><p>或许几年之后，我会再次来到这里。</p><p>希望那时候，不再是以参观者的身份。</p><p>而是作为一名工程师。</p>]]></content>
    
    
    <summary type="html">&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;p&gt;&lt;img src=&quot;https://haodehaode378.oss-cn-shanghai.aliyuncs.com/test/202607222019857.jpg&quot; alt=&quot;香港中文大学（深圳）校园入口&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://college-github-io.pages.dev/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="深圳" scheme="https://college-github-io.pages.dev/tags/%E6%B7%B1%E5%9C%B3/"/>
    
    <category term="大学参观" scheme="https://college-github-io.pages.dev/tags/%E5%A4%A7%E5%AD%A6%E5%8F%82%E8%A7%82/"/>
    
    <category term="工程实践" scheme="https://college-github-io.pages.dev/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="成长" scheme="https://college-github-io.pages.dev/tags/%E6%88%90%E9%95%BF/"/>
    
  </entry>
  
  <entry>
    <title>读《在 AI 浪潮下，如何留在牌桌上》：AI 时代，我想成为怎样的开发者</title>
    <link href="https://college-github-io.pages.dev/posts/20021fb6/"/>
    <id>https://college-github-io.pages.dev/posts/20021fb6/</id>
    <published>2026-07-21T11:00:00.000Z</published>
    <updated>2026-07-22T09:25:15.535Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文：<a href="https://innei.in/notes/2026/6/28/stay-in-the-game-in-the-ai-era">在 AI 浪潮下，如何留在牌桌上</a></p><p>作者：Innei｜发布于 2026 年 6 月 28 日</p><p>建议先阅读原文，再回来看这篇文章。</p></blockquote><p>最近读到 Innei 的《在 AI 浪潮下，如何留在牌桌上》，我停下来想了很久。</p><p>这篇文章真正触动我的，并不是“AI 会不会取代程序员”这个已经被反复讨论的问题，而是另一个更具体、也更难回答的问题：当 AI 已经能够快速生成代码、页面甚至完整项目时，一个开发者还能提供什么不可替代的价值？</p><h2 id="从-会不会被取代-到-我能负责什么">从“会不会被取代”到“我能负责什么”</h2><p>原文从职业焦虑写起。AI 编程工具在很短的时间里从辅助补全发展成可以独立处理复杂任务的 Agent。过去我们可能会担心，过度依赖工具会不会让自己的基本功退化；现在更现实的压力却是，几乎所有人都开始使用这些工具，仅仅“会用 AI”已经不足以成为优势。</p><p>我很认同这一点。</p><p>如果两个人都可以让 AI 在几分钟内生成一个项目，那么真正拉开差距的，不再只是生成速度，而是后面的一连串问题：需求是否定义清楚，方案是否适合真实用户，代码是否可靠，异常是否被考虑，最终结果是否真的可以交付。</p><p>AI 可以给出答案，但开发者仍然要对答案负责。</p><p>所以，比起继续证明自己比 AI 更会写代码，我更应该训练另一种能力：知道应该做什么，能够判断结果好不好，并且有能力把一个不稳定的生成结果变成真正可用的产品。</p><h2 id="一次加载动画带给我的真实体会">一次加载动画带给我的真实体会</h2><p>最近我一直在修改自己的 Hexo 博客加载动画。最初的目标看起来很简单：把普通的加载效果换成霓虹线条描边的 Bronze，并让动画速度跟随页面真实加载进度。</p><p>代码很快就能生成，但真正落地以后，问题才一个个出现：</p><ul><li>Bronze 的视觉中心和 SVG 画布中心并不一致；</li><li>亮色和暗色主题需要不同的背景与辅助线对比度；</li><li>PJAX 切页不能重复创建动画和光标；</li><li>页面加载结束后必须恢复滚动状态；</li><li>自定义鼠标初始坐标是 <code>(0,0)</code>，导致圆环会从左上角滑回真实位置；</li><li>移动端、减少动态效果偏好和异常超时也需要分别处理。</li></ul><p>这些问题没有哪个特别高深，却共同决定了它到底是一个演示效果，还是一个能够长期放在博客里的功能。</p><p>这让我更直观地理解了原文讨论的“留在牌桌上”：价值并不只存在于把第一版代码写出来，而在于发现问题、建立标准、验证结果并完成最后那段经常被忽略的距离。</p><h2 id="我不完全同意-ui-已经没那么重要">我不完全同意“UI 已经没那么重要”</h2><p>原文提到，在快速迭代和功能优先的 AI 产品中，UI 与 UX 的重要性似乎有所下降。这个观察有现实依据，但我只同意一半。</p><p>在产品还没有验证需求之前，过早追求像素级精致，确实可能只是浪费时间。功能是否解决问题，永远比表面是否漂亮更重要。</p><p>但 AI 正在快速降低“把界面做出来”的成本。当所有人都能生成一个功能完整的页面时，体验、判断和细节反而会成为新的区分度。按钮什么时候应该自动执行，什么时候必须等待用户确认；错误信息怎样表达；加载过程是否让人安心；页面在不同设备上是否稳定——这些都不是简单生成一份 UI 代码就能自然得到的。</p><p>AI 让实现变得便宜，但没有让选择变得容易。</p><h2 id="基础能力仍然重要-只是使用方式变了">基础能力仍然重要，只是使用方式变了</h2><p>AI 时代并不意味着可以放弃基础知识。恰恰相反，如果不理解 DOM、事件生命周期、网络请求、状态管理和基本的可访问性，就很难判断 AI 给出的代码为什么出错，也无法知道它只是“看起来能运行”，还是真的可靠。</p><p>以前学习基础，是为了亲手完成每一行实现；现在学习基础，还多了一个目的：审查、纠正和组织 AI 的产出。</p><p>这也意味着，我不需要在“坚持手写代码”和“完全交给 AI”之间二选一。更合理的方式，是让 AI 承担重复劳动和探索成本，把自己的注意力放在问题定义、架构取舍、质量验证与最终责任上。</p><h2 id="个人品牌也是一种长期资产">个人品牌也是一种长期资产</h2><p>原文还有一个观点让我很有共鸣：除了工作能力，还要保留自己的公开输出和个人入口。</p><p>博客、开源项目、学习笔记和真实 Demo，看起来不能立刻带来回报，但它们会持续记录一个人解决过什么问题、形成了怎样的判断。简历只能告诉别人“我会什么”，长期作品却能让别人看到“我是怎样做事的”。</p><p>这也是我愿意继续维护这个博客的原因。写文章并不只是整理知识，也是在逼自己把模糊的感觉变成可以说明、可以复查的观点。哪怕现在的理解还不成熟，它也会成为以后回头观察自己成长轨迹的坐标。</p><h2 id="我给自己的行动清单">我给自己的行动清单</h2><p>读完文章以后，我想给自己留下几条更具体的提醒：</p><ol><li><strong>继续学习基础。</strong> 不为了和 AI 比拼手写速度，而是为了拥有判断和纠错能力。</li><li><strong>把 AI 当作放大器。</strong> 用它提高探索与实现效率，但不把最终责任一起交出去。</li><li><strong>多做真正完成的项目。</strong> 少停留在“已经跑起来”，多关注部署、异常、维护和用户体验。</li><li><strong>建立验证习惯。</strong> 对生成结果进行测试、审查和实际环境验证，不用“看起来没问题”代替证据。</li><li><strong>持续公开表达。</strong> 通过博客和项目积累自己的作品、判断与可信度。</li><li><strong>保留人的感受。</strong> 技术最终服务的是人。效率、成本和指标之外，仍然要理解使用者的处境。</li></ol><h2 id="写在最后">写在最后</h2><p>我现在依然无法准确回答，未来最稳定的职业名称会是什么。前端工程师、全栈工程师、AI 产品工程师，或许都只是阶段性的标签。</p><p>但我越来越确定，所谓留在牌桌上，不是追上每一个新模型，也不是同时打开更多 Agent，让它们替自己写更多代码。</p><p>真正重要的是：当工具越来越强时，我是否仍然能够提出值得解决的问题，判断什么结果是好的，把不确定的输出变成可靠的产品，并愿意对最终交付负责。</p><p>AI 可以参与创作，但方向、标准和责任，仍然需要由人来承担。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文：&lt;a href=&quot;https://innei.in/notes/2026/6/28/stay-in-the-game-in-the-ai-era&quot;&gt;在 AI 浪潮下，如何留在牌桌上&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作者：Innei｜发布于 2026</summary>
        
      
    
    
    
    <category term="AI思考" scheme="https://college-github-io.pages.dev/categories/AI%E6%80%9D%E8%80%83/"/>
    
    
    <category term="AI" scheme="https://college-github-io.pages.dev/tags/AI/"/>
    
    <category term="职业成长" scheme="https://college-github-io.pages.dev/tags/%E8%81%8C%E4%B8%9A%E6%88%90%E9%95%BF/"/>
    
    <category term="开发者" scheme="https://college-github-io.pages.dev/tags/%E5%BC%80%E5%8F%91%E8%80%85/"/>
    
    <category term="读后感" scheme="https://college-github-io.pages.dev/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>AI 的下一个关键词，不是 Agent，而是 Loop</title>
    <link href="https://college-github-io.pages.dev/posts/8f3a2c19/"/>
    <id>https://college-github-io.pages.dev/posts/8f3a2c19/</id>
    <published>2026-06-16T12:00:00.000Z</published>
    <updated>2026-06-16T05:18:05.380Z</updated>
    
    <content type="html"><![CDATA[<h1 id="ai-的下一个关键词-不是-agent-而是-loop">AI 的下一个关键词，不是 Agent，而是 Loop</h1><p>过去一年，几乎所有人都在谈 Agent。</p><p>它能读文件，能调用工具，能写代码，能拆解任务，甚至能像一个员工一样连续工作几个小时。于是很多人开始相信，AI 的下一阶段就是“智能体时代”。</p><p>但最近，一个更值得关注的词正在出现：<strong>Loop</strong>。</p><p>Agent 解决的是“AI 能不能行动”的问题。Loop 解决的是“AI 能不能越做越好”的问题。</p><p>这两者差别很大。</p><h2 id="从一次回答-到持续闭环">从一次回答，到持续闭环</h2><p>过去我们使用 AI，大多是一次性的。</p><p>你输入一个问题，它给你一个答案。答案好不好，主要靠你自己判断。它像一个很聪明的临时顾问，但每一次对话结束后，经验很难沉淀下来。</p><p>Agent 往前走了一步。它不只是回答，而是可以执行。</p><p>比如你让它改代码，它会读项目、找文件、修改、运行测试，再根据错误继续修复。它已经不像聊天框，更像一个可以被委派任务的执行者。</p><p>但真正让 AI 进入生产系统的，不只是执行，而是闭环。</p><p>什么是 Loop？</p><p>简单说，就是一个持续循环：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">目标 -&gt; 行动 -&gt; 反馈 -&gt; 修正 -&gt; 再行动</span><br></pre></td></tr></table></figure><p>如果 AI 写了一段代码，测试失败，它能读懂报错并继续修改，这就是一个小闭环。</p><p>如果 AI 做了一次营销活动，系统能回收转化数据，判断哪类文案有效，并用于下一次生成，这就是业务闭环。</p><p>如果 AI 客服回答问题后，用户满意度、人工接管率、投诉率都能反向进入系统，帮助它调整策略，这就是服务闭环。</p><p>Loop 的本质，是让 AI 不再只是“生成内容”，而是进入一个会被结果校正的系统。</p><h2 id="为什么-loop-比-agent-更重要">为什么 Loop 比 Agent 更重要</h2><p>很多 AI 应用失败，不是因为模型不聪明，而是因为它没有反馈。</p><p>没有反馈，AI 就只能凭语言上的合理性输出。它可能说得很流畅，也可能看起来很专业，但不一定真的有效。</p><p>而 Loop 把真实世界的结果带回来了。</p><p>写代码，要看测试是否通过。</p><p>做销售，要看客户是否转化。</p><p>做风控，要看误判率是否下降。</p><p>做内容，要看阅读、停留、转发和成交。</p><p>当这些结果进入循环，AI 才开始从“会说”走向“会改”。</p><p>这也是最近 AI 工具变化很明显的地方。早期的 AI 更像问答助手，后来变成能执行任务的 Agent，现在则逐渐走向可验证、可修正、可持续运行的工作流。</p><p>换句话说，Agent 让 AI 动起来，Loop 让 AI 长出来。</p><h2 id="坏的闭环会放大错误">坏的闭环会放大错误</h2><p>不过，Loop 并不是越自动越好。</p><p>一个坏的闭环，会让错误被放大。如果评价标准错了，AI 就会朝错误方向优化。</p><p>比如只追求点击率，内容可能越来越标题党。</p><p>只追求成交率，销售话术可能越来越激进。</p><p>只追求效率，客服可能牺牲用户体验。</p><p>所以未来真正有价值的 AI 系统，不是简单堆很多 Agent，而是设计好的 Loop。</p><p>它至少需要三个东西。</p><h2 id="一个好-loop-需要什么">一个好 Loop 需要什么</h2><p>第一，清晰的目标。</p><p>AI 必须知道什么叫“好”。不是一句模糊的“帮我优化”，而是有可验证的标准。</p><p>第二，可靠的反馈。</p><p>反馈不能只靠感觉，而要来自测试、数据、用户行为、人工审核或业务结果。</p><p>第三，必要的人类介入。</p><p>Loop 不是把人踢出去，而是让人出现在最关键的位置：定标准、控风险、审结果。</p><p>这也是未来职场变化的核心。</p><p>人不会只是跟 AI 聊天，也不会只是让 AI 替自己做事。更重要的是，人要学会设计闭环：把任务拆成可执行的流程，把结果变成可评价的数据，把经验沉淀成下一轮更好的行动。</p><p>谁能设计更好的 Loop，谁就能把 AI 用得更深。</p><h2 id="最后">最后</h2><p>所以，AI 的下一阶段，关键词可能真的不是 Agent，而是 Loop。</p><p>Agent 让 AI 能执行。</p><p>Loop 让 AI 能进化。</p><p>真正的变化，不是 AI 给了我们一个更聪明的答案，而是我们开始拥有一种新的工作方式：一个可以执行、反馈、修正，并持续改进的系统。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;ai-的下一个关键词-不是-agent-而是-loop&quot;&gt;AI 的下一个关键词，不是 Agent，而是 Loop&lt;/h1&gt;
&lt;p&gt;过去一年，几乎所有人都在谈</summary>
        
      
    
    
    
    <category term="AI观察" scheme="https://college-github-io.pages.dev/categories/AI%E8%A7%82%E5%AF%9F/"/>
    
    
    <category term="Agent" scheme="https://college-github-io.pages.dev/tags/Agent/"/>
    
    <category term="AI" scheme="https://college-github-io.pages.dev/tags/AI/"/>
    
    <category term="Loop" scheme="https://college-github-io.pages.dev/tags/Loop/"/>
    
    <category term="人工智能" scheme="https://college-github-io.pages.dev/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="趋势观察" scheme="https://college-github-io.pages.dev/tags/%E8%B6%8B%E5%8A%BF%E8%A7%82%E5%AF%9F/"/>
    
  </entry>
  
  <entry>
    <title>数据库第六章作业答案</title>
    <link href="https://college-github-io.pages.dev/posts/858cdf7e/"/>
    <id>https://college-github-io.pages.dev/posts/858cdf7e/</id>
    <published>2026-06-10T04:59:12.000Z</published>
    <updated>2026-06-10T05:10:36.173Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数据库第六章作业答案">数据库第六章作业答案</h1><p>第六章作业，共 <strong>50道单选题</strong>，主要覆盖关系规范化、函数依赖、无损连接与保持依赖、事务 ACID 特性、并发控制、封锁协议、数据库恢复等内容。</p><blockquote><p>说明：第3题选项存在一定不严谨之处。若按题库常见答案，应选 <strong>A</strong>；若严格按“最小函数依赖集”定义，<code>AED→C</code> 可由 <code>A→C</code> 推出，应删除，因此严格结果应为 <code>&#123;A→E, A→C, B→D&#125;</code>，但选项中没有完全正确项。</p></blockquote><hr><h2 id="答案速查表">答案速查表</h2><table><thead><tr><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">A</td><td style="text-align:center">14</td><td style="text-align:center">A</td><td style="text-align:center">27</td><td style="text-align:center">C</td><td style="text-align:center">40</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">B</td><td style="text-align:center">15</td><td style="text-align:center">A</td><td style="text-align:center">28</td><td style="text-align:center">C</td><td style="text-align:center">41</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">A*</td><td style="text-align:center">16</td><td style="text-align:center">B</td><td style="text-align:center">29</td><td style="text-align:center">B</td><td style="text-align:center">42</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">D</td><td style="text-align:center">17</td><td style="text-align:center">B</td><td style="text-align:center">30</td><td style="text-align:center">C</td><td style="text-align:center">43</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">B</td><td style="text-align:center">18</td><td style="text-align:center">B</td><td style="text-align:center">31</td><td style="text-align:center">D</td><td style="text-align:center">44</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">C</td><td style="text-align:center">19</td><td style="text-align:center">A</td><td style="text-align:center">32</td><td style="text-align:center">C</td><td style="text-align:center">45</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">D</td><td style="text-align:center">20</td><td style="text-align:center">D</td><td style="text-align:center">33</td><td style="text-align:center">B</td><td style="text-align:center">46</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">B</td><td style="text-align:center">21</td><td style="text-align:center">A</td><td style="text-align:center">34</td><td style="text-align:center">C</td><td style="text-align:center">47</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td style="text-align:center">D</td><td style="text-align:center">22</td><td style="text-align:center">A</td><td style="text-align:center">35</td><td style="text-align:center">D</td><td style="text-align:center">48</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">10</td><td style="text-align:center">C</td><td style="text-align:center">23</td><td style="text-align:center">B</td><td style="text-align:center">36</td><td style="text-align:center">D</td><td style="text-align:center">49</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">11</td><td style="text-align:center">D</td><td style="text-align:center">24</td><td style="text-align:center">A</td><td style="text-align:center">37</td><td style="text-align:center">C</td><td style="text-align:center">50</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">12</td><td style="text-align:center">A</td><td style="text-align:center">25</td><td style="text-align:center">B</td><td style="text-align:center">38</td><td style="text-align:center">B</td><td style="text-align:center"></td><td style="text-align:center"></td></tr><tr><td style="text-align:center">13</td><td style="text-align:center">A</td><td style="text-align:center">26</td><td style="text-align:center">D</td><td style="text-align:center">39</td><td style="text-align:center">D</td><td style="text-align:center"></td><td style="text-align:center"></td></tr></tbody></table><hr><h2 id="详细题目与答案">详细题目与答案</h2><h3 id="1-10题">1-10题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目简述</th><th>选项</th><th style="text-align:center">答案</th><th>简析</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td>购物车(买家号、买家名、商品号、商品名、数量)，买家和商品是多对多，同一买家同一商品只累加数量，该关系模式最高范式为？</td><td>A. 1NF  B. 2NF  C. 3NF  D. BCNF</td><td style="text-align:center">A</td><td>主码为(买家号, 商品号)。买家名只依赖买家号，商品名只依赖商品号，存在非主属性对组合码的部分函数依赖，所以只能达到1NF。</td></tr><tr><td style="text-align:center">2</td><td>R(ABCD)，F={A→B，B→C，C→D，D→A}，分解p={AB，AD}相对于F如何？</td><td>A. 无损且保持FD  B. 无损但不保持FD  C. 有损但保持FD  D. 有损且不保持FD</td><td style="text-align:center">B</td><td>AB与AD的交集是A，A可以推出B和D，所以分解无损；但C相关依赖如B→C、C→D无法在AB或AD中直接保持，所以不保持FD。</td></tr><tr><td style="text-align:center">3</td><td>R(U,F)，U={A,B,C,D,E}，F={A→EC, AED→C, B→D}，哪个是最小函数依赖集？</td><td>A. {A→E, A→C, AED→C, B→D}  B. {A→EC, AED→C, B→D}  C. {A→E, A→C, D→C, B→D}  D. {A→E, A→C, AD→C, B→D}</td><td style="text-align:center">A*</td><td>题库口径通常选A，因为它把A→EC拆成A→E和A→C。但严格按最小依赖集，AED→C可由A→C推出，应删去，严格结果为{A→E, A→C, B→D}，四个选项都不完全严谨。</td></tr><tr><td style="text-align:center">4</td><td>F={A→BC，B→D，A→D，AD→C}，求最小函数依赖集。</td><td>A. 原F  B. 去A→D  C. 去AD→C  D. {A→BC，B→D}</td><td style="text-align:center">D</td><td>A→D可由A→BC和B→D推出；AD→C可由A→BC推出；剩下{A→BC，B→D}即可。</td></tr><tr><td style="text-align:center">5</td><td>R(abc)，属性a、b之间是1:n联系，正确的数据依赖是？</td><td>A. a→b  B. b→a  C. 不存在数据依赖  D. a↔b</td><td style="text-align:center">B</td><td>1:n中，n端能唯一确定1端。若a到b是一对多，则b→a。</td></tr><tr><td style="text-align:center">6</td><td>Students(Sid，Sname，Dname，Ddirector，Cid，Cname，Cscore)中，学生退选课程导致课程丢失，属于什么异常？</td><td>A. 数据冗余  B. 插入异常  C. 删除异常  D. 更新异常</td><td style="text-align:center">C</td><td>删除某个学生选课记录时，把课程信息也删没了，是删除异常。</td></tr><tr><td style="text-align:center">7</td><td>无损连接和保持函数依赖之间的关系是？</td><td>A. 同时成立或不成立  B. 前者包含后者  C. 后者包含前者  D. 没有必然联系</td><td style="text-align:center">D</td><td>二者是不同目标：无损关注分解后能否还原原关系，保持依赖关注依赖能否在分解后的关系上检查，二者没有必然联系。</td></tr><tr><td style="text-align:center">8</td><td>R(ABC)，F={A→C，B→C}，p={AC，BC}是否无损并保持FD？</td><td>A. 有损、不保持FD  B. 有损、保持FD  C. 无损、不保持FD  D. 无损、保持FD</td><td style="text-align:center">B</td><td>A→C在AC中保持，B→C在BC中保持；但AC与BC交集为C，C不能推出AC或BC任一关系全部属性，所以是有损分解、保持FD。</td></tr><tr><td style="text-align:center">9</td><td>A(S,C,M)，每个学生每门课程有名次；每门课程每一名次只有一个学生，最高范式为？</td><td>A. 1NF  B. 2NF  C. 3NF  D. BCNF</td><td style="text-align:center">D</td><td>函数依赖有SC→M、CM→S，候选码为SC和CM。每个非平凡依赖左部都是候选码，满足BCNF。</td></tr><tr><td style="text-align:center">10</td><td>2NF的二维表消除了非主属性对码的传递函数依赖，则必定是？</td><td>A. 1NF  B. 2NF  C. 3NF  D. BCNF</td><td style="text-align:center">C</td><td>2NF消除部分依赖；再消除非主属性对码的传递依赖，就达到3NF。</td></tr></tbody></table><h3 id="11-20题">11-20题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目简述</th><th>选项</th><th style="text-align:center">答案</th><th>简析</th></tr></thead><tbody><tr><td style="text-align:center">11</td><td>部门关系中“部门成员”取值为“小虎、小明”，因哪个属性不满足1NF？</td><td>A. 部门号  B. 部门名  C. 部门总经理  D. 部门成员</td><td style="text-align:center">D</td><td>部门成员包含多个值，不是不可再分的原子值，违反第一范式。</td></tr><tr><td style="text-align:center">12</td><td>一个第三范式的关系模式是否属于第二范式？</td><td>A. 一定  B. 不一定  C. 一定不  D. 以上都不是</td><td style="text-align:center">A</td><td>范式层级一般为BCNF高于3NF，3NF高于2NF，3NF一定属于2NF。</td></tr><tr><td style="text-align:center">13</td><td>关系数据库规范化是为解决哪些问题而引入的？</td><td>A. 插入异常、删除异常和数据冗余  B. 提高查询速度  C. 减少操作复杂性  D. 保证安全性和完整性</td><td style="text-align:center">A</td><td>规范化主要解决数据冗余以及插入、删除、更新异常。</td></tr><tr><td style="text-align:center">14</td><td>关系规范化中的删除异常是指什么？</td><td>A. 不该删除的数据被删除  B. 不该插入的数据被插入  C. 应删未删  D. 应插未插</td><td style="text-align:center">A</td><td>删除异常指删除某条记录时，把仍应保留的信息也一起删除了。</td></tr><tr><td style="text-align:center">15</td><td>下面对3NF的叙述中，不正确的是？</td><td>A. 3NF模式中不存在属性对候选键的传递依赖  B. 不存在非主属性对候选键部分依赖  C. 3NF一定是2NF  D. 可无损且保持依赖分解到3NF</td><td style="text-align:center">A</td><td>3NF限制的是非主属性对候选键的传递依赖，不能笼统说所有属性都不存在对候选键的传递依赖。</td></tr><tr><td style="text-align:center">16</td><td>X→Y且Y不能决定X，则Y与X之间的关系是？</td><td>A. 一对一  B. 一对多  C. 多对多  D. 多对一</td><td style="text-align:center">B</td><td>X决定Y，说明一个X只对应一个Y；Y不能决定X，说明一个Y可对应多个X，所以从Y到X是一对多。</td></tr><tr><td style="text-align:center">17</td><td>学生(学号，课程号，名次)中，哪项表述错误？</td><td>A. 两个候选码都可以  B. 只有(学号,课程号)可作候选码  C. 属于3NF  D. 属于BCNF</td><td style="text-align:center">B</td><td>候选码不仅有(学号,课程号)，还有(课程号,名次)，所以“只有(学号,课程号)可以作为候选码”错误。</td></tr><tr><td style="text-align:center">18</td><td>R(U,F)∈3NF，下列说法正确的是？</td><td>A. 一定消除插入和删除异常  B. 仍存在一定插入和删除异常  C. 一定属于BCNF  D. A、C都成立</td><td style="text-align:center">B</td><td>3NF降低异常，但不保证完全消除插入和删除异常，也不一定属于BCNF。</td></tr><tr><td style="text-align:center">19</td><td>R(ABCDE)，F={A→C,B→E}，候选码为？</td><td>A. ABD  B. B  C. A  D. BC</td><td style="text-align:center">A</td><td>A能推出C，B能推出E，但D无法由其他属性推出，且A、B也不能省，所以候选码是ABD。</td></tr><tr><td style="text-align:center">20</td><td>借阅(书号，书名，库存数，读者号，借期，还期)，同一本书允许一个读者多次借阅但不能同时借多本，主码是？</td><td>A. 书号  B. 读者号  C. 书号+读者号  D. 书号+读者号+借期</td><td style="text-align:center">D</td><td>同一读者可多次借同一本书，书号+读者号不足以区分多次借阅，需加借期。</td></tr></tbody></table><h3 id="21-30题">21-30题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目简述</th><th>选项</th><th style="text-align:center">答案</th><th>简析</th></tr></thead><tbody><tr><td style="text-align:center">21</td><td>事务T对数据D已加S锁，其他事务对D能否加锁？</td><td>A. 可加S锁，不能加X锁  B. 可加S锁，也可加X锁  C. 不能加S锁，可加X锁  D. 不能加任何锁</td><td style="text-align:center">A</td><td>共享锁与共享锁兼容，但共享锁与排它锁不兼容。</td></tr><tr><td style="text-align:center">22</td><td>有关事务特性表述错误的是？</td><td>A. 原子性指字段不可拆分  B. 一致性满足约束  C. 隔离性互不影响  D. 持久性永久保存</td><td style="text-align:center">A</td><td>事务原子性是指事务操作要么全做要么全不做，不是字段值不可拆分；字段不可拆分属于1NF。</td></tr><tr><td style="text-align:center">23</td><td>二级封锁协议不能解决哪种并发不一致？</td><td>A. 丢失修改  B. 不可重复读  C. 脏读  D. 重复修改</td><td style="text-align:center">B</td><td>二级封锁协议可防止丢失修改和读脏数据，但不能保证可重复读。</td></tr><tr><td style="text-align:center">24</td><td>数据库恢复中，对已经提交的事务执行什么处理？</td><td>A. REDO  B. ABORT  C. UNDO  D. ROLLBACK</td><td style="text-align:center">A</td><td>已提交事务的更新应重做，即REDO。</td></tr><tr><td style="text-align:center">25</td><td>物理存储介质损坏时，最有效的恢复策略是什么？</td><td>A. 日志前滚  B. 备份文件全量恢复  C. 仅日志恢复  D. 修复介质</td><td style="text-align:center">B</td><td>介质损坏通常先从备份文件恢复数据库，再结合日志补充恢复。</td></tr><tr><td style="text-align:center">26</td><td>关于数据库封锁机制，哪项正确？</td><td>A. 只确保安全性  B. 仅单用户  C. S锁允许读和改  D. 控制并发访问确保一致性</td><td style="text-align:center">D</td><td>封锁机制通过控制多用户并发访问，保证数据一致性和完整性。</td></tr><tr><td style="text-align:center">27</td><td>关于数据库并发控制，哪项最准确？</td><td>A. 允许并行处理事务  B. 不需要控制  C. 协调执行顺序和资源访问  D. 只关注响应时间</td><td style="text-align:center">C</td><td>并发控制通过协调事务执行顺序和资源访问方式，保证隔离性和一致性。</td></tr><tr><td style="text-align:center">28</td><td>事务一致性的正确描述是？</td><td>A. 要么全做要么不做  B. 提交后永久  C. 一致状态到一致状态  D. 对其他事务隔离</td><td style="text-align:center">C</td><td>一致性指事务执行结果必须使数据库从一个一致状态转移到另一个一致状态。</td></tr><tr><td style="text-align:center">29</td><td>事务处理中将数据库更新的全部内容写入哪里？</td><td>A. 副本文件  B. 日志文件  C. 检查点文件  D. 备注文件</td><td style="text-align:center">B</td><td>数据库更新信息需要写入日志文件，用于恢复。</td></tr><tr><td style="text-align:center">30</td><td>数据库恢复的基础是哪些冗余数据？</td><td>A. 数据字典、应用程序、审计档案、后备副本  B. 数据字典、应用程序、日志文件、审计档案  C. 日志文件、数据库后备副本  D. 数据字典、应用程序、后备副本</td><td style="text-align:center">C</td><td>恢复依赖数据库后备副本和日志文件。</td></tr></tbody></table><h3 id="31-40题">31-40题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目简述</th><th>选项</th><th style="text-align:center">答案</th><th>简析</th></tr></thead><tbody><tr><td style="text-align:center">31</td><td>并发操作会带来哪些数据不一致性？</td><td>A. 丢失修改、不可重复读、脏读、死锁  B. 不可重复读、脏读、死锁  C. 丢失修改、脏读、死锁  D. 丢失修改、不可重复读、脏读</td><td style="text-align:center">D</td><td>典型不一致包括丢失修改、不可重复读、脏读。死锁是并发问题，但不属于数据不一致类型。</td></tr><tr><td style="text-align:center">32</td><td>用于数据库恢复的重要文件是？</td><td>A. 数据库文件  B. 索引文件  C. 日志文件  D. 备注文件</td><td style="text-align:center">C</td><td>日志文件记录事务更新，是恢复的重要依据。</td></tr><tr><td style="text-align:center">33</td><td>若数据库只包含成功事务提交的结果，则数据库处于什么状态？</td><td>A. 安全  B. 一致  C. 不安全  D. 不一致</td><td style="text-align:center">B</td><td>只包含成功提交结果，说明没有未完成或失败事务影响数据库，处于一致状态。</td></tr><tr><td style="text-align:center">34</td><td>数据库系统并发控制的主要方法采用什么机制？</td><td>A. 拒绝  B. 改为串行  C. 封锁  D. 不控制</td><td style="text-align:center">C</td><td>并发控制主要采用封锁机制。</td></tr><tr><td style="text-align:center">35</td><td>并发操作若不加控制，可能带来什么问题？</td><td>A. 不安全  B. 死锁  C. 死机  D. 不一致</td><td style="text-align:center">D</td><td>多个事务同时读写同一数据可能导致丢失修改、脏读等数据不一致。</td></tr><tr><td style="text-align:center">36</td><td>关于死锁，下列说法正确的是？</td><td>A. 数据库无死锁  B. 禁止两个用户同时操作  C. 竞争相同资源不会死锁  D. 并发操作才可能死锁</td><td style="text-align:center">D</td><td>死锁产生于并发环境下多个事务相互等待资源的情况。</td></tr><tr><td style="text-align:center">37</td><td>数据库中的封锁机制是什么的主要方法？</td><td>A. 完整性  B. 安全性  C. 并发控制  D. 恢复</td><td style="text-align:center">C</td><td>封锁机制是实现并发控制的主要方法。</td></tr><tr><td style="text-align:center">38</td><td>不允许任何其他事务对锁定目标再加任何类型锁的是？</td><td>A. 共享锁  B. 排它锁</td><td style="text-align:center">B</td><td>排它锁与共享锁、排它锁都不兼容。</td></tr><tr><td style="text-align:center">39</td><td>若事务T对数据R已加X锁，其他事务对R能否加锁？</td><td>A. 可加S不能加X  B. 不能加S可加X  C. 可加S也可加X  D. 不能加任何锁</td><td style="text-align:center">D</td><td>排它锁独占数据，其他事务不能再加S锁或X锁。</td></tr><tr><td style="text-align:center">40</td><td>多用户数据库系统要让用户像面对单用户数据库一样使用，必须进行什么控制？</td><td>A. 安全性控制  B. 完整性控制  C. 并发控制</td><td style="text-align:center">C</td><td>需要通过并发控制保证事务之间互不干扰。</td></tr></tbody></table><h3 id="41-50题">41-50题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目简述</th><th>选项</th><th style="text-align:center">答案</th><th>简析</th></tr></thead><tbody><tr><td style="text-align:center">41</td><td>事务的持久性是指什么？</td><td>A. 要么全做要么不做  B. 提交后永久  C. 对其他事务隔离  D. 一致状态到一致状态</td><td style="text-align:center">B</td><td>持久性指事务一旦提交，对数据库的改变就是永久的。</td></tr><tr><td style="text-align:center">42</td><td>事务的隔离性是指什么？</td><td>A. 要么全做要么不做  B. 提交后永久  C. 对其他事务隔离  D. 一致状态到一致状态</td><td style="text-align:center">C</td><td>隔离性指一个事务内部操作及使用的数据对其他并发事务隔离。</td></tr><tr><td style="text-align:center">43</td><td>事务的一致性是指什么？</td><td>A. 要么全做要么不做  B. 提交后永久  C. 对其他事务隔离  D. 一致状态到一致状态</td><td style="text-align:center">D</td><td>一致性指事务必须使数据库从一个一致状态变到另一个一致状态。</td></tr><tr><td style="text-align:center">44</td><td>事务的原子性是指什么？</td><td>A. 一致状态到一致状态  B. 提交后永久  C. 对其他事务隔离  D. 要么全做要么不做</td><td style="text-align:center">D</td><td>原子性指事务包含的所有操作要么全部执行，要么全部不执行。</td></tr><tr><td style="text-align:center">45</td><td>若数据库中只包含成功事务提交的结果，则数据库处于什么状态？</td><td>A. 安全  B. 一致  C. 不安全  D. 不一致</td><td style="text-align:center">B</td><td>与第33题相同，处于一致状态。</td></tr><tr><td style="text-align:center">46</td><td>数据库中的封锁机制是什么的主要方法？</td><td>A. 完整性  B. 安全性  C. 并发控制  D. 恢复</td><td style="text-align:center">C</td><td>与第37题相同，是并发控制的主要方法。</td></tr><tr><td style="text-align:center">47</td><td>E-R模型中，3个实体型、3个m:n联系，转换后关系数目为？</td><td>A. 4  B. 5  C. 6  D. 7</td><td style="text-align:center">C</td><td>每个实体型转为1个关系，共3个；每个m:n联系也转为1个关系，共3个；合计6个。</td></tr><tr><td style="text-align:center">48</td><td>数据库恢复基础所利用的转储冗余数据是什么？</td><td>A. 数据字典、应用程序、审计档案、后备副本  B. 数据字典、应用程序、日志文件、审计档案  C. 日志文件、数据库后备副本  D. 数据字典、应用程序、后备副本</td><td style="text-align:center">C</td><td>与第30题相同，主要是日志文件和数据库后备副本。</td></tr><tr><td style="text-align:center">49</td><td>事务隔离性是指什么？</td><td>A. 一个事务内部操作及数据对其他并发事务隔离  B. 提交后永久  C. 要么全做要么不做  D. 一致状态到一致状态</td><td style="text-align:center">A</td><td>隔离性指一个事务内部操作以及使用的数据对并发的其他事务隔离。</td></tr><tr><td style="text-align:center">50</td><td>数据库使用读写分离最主要目的是什么？</td><td>A. 应对读多写少场景  B. 减少X锁与S锁竞争  C. 及时备份数据  D. 水平或垂直拆分数据库</td><td style="text-align:center">A</td><td>读写分离主要应对读多写少场景，把读请求分散到从库，提高读扩展能力。</td></tr></tbody></table><hr><h2 id="易错题说明">易错题说明</h2><h3 id="第1题：购物车关系为什么只是1nf">第1题：购物车关系为什么只是1NF</h3><p>购物车关系为：<code>购物车(买家号、买家名、商品号、商品名、数量)</code>。根据业务规则，一个买家可以有多个商品，一个商品也可以被多个买家加入购物车，同一买家同一商品只累加数量，因此主码应为 <code>(买家号, 商品号)</code>。但是 <code>买家号→买家名</code>，<code>商品号→商品名</code>，也就是说非主属性“买家名”和“商品名”只依赖组合码的一部分，存在部分函数依赖，所以不满足2NF，只能达到1NF。</p><h3 id="第2题：如何判断无损连接和保持依赖">第2题：如何判断无损连接和保持依赖</h3><p>分解为 <code>&#123;AB, AD&#125;</code>，两个子模式的公共属性是 <code>A</code>。因为 <code>A→B</code> 且 <code>A→D</code>，公共属性A可以决定至少一个子模式的全部属性，所以分解是无损连接分解。保持依赖则要看原来的依赖是否可以在分解后的子关系中分别检查。由于C没有出现在任一子模式中，<code>B→C</code>、<code>C→D</code>等依赖无法保持，所以该分解不保持函数依赖。</p><h3 id="第3题：最小函数依赖集的严格做法">第3题：最小函数依赖集的严格做法</h3><p>原依赖集为：<code>F=&#123;A→EC, AED→C, B→D&#125;</code>。先将右部拆成单属性，得到：<code>A→E, A→C, AED→C, B→D</code>。然后检查冗余依赖，由于已有 <code>A→C</code>，所以无论是否带有E、D，<code>AED→C</code> 都是冗余的。严格最小依赖集应为：<code>&#123;A→E, A→C, B→D&#125;</code>。本题四个选项没有这个结果，所以若平台要求单选，一般按题库口径选择A。</p><h3 id="第8题：为什么保持fd但有损">第8题：为什么保持FD但有损</h3><p>分解为 <code>AC</code> 和 <code>BC</code>。依赖 <code>A→C</code> 可以在AC中检查，<code>B→C</code> 可以在BC中检查，所以保持函数依赖。判断无损时看公共属性 <code>C</code> 是否能决定某个子关系的全部属性，即是否有 <code>C→A</code> 或 <code>C→B</code>。题中没有这些依赖，因此不能保证无损连接，所以是有损分解、保持FD。</p><h3 id="第9题和第17题：学生-课程-名次模型">第9题和第17题：学生、课程、名次模型</h3><p>关系为 <code>A(S,C,M)</code>，语义为每个学生每门课程有一个名次，且每门课程每一名次只有一个学生。由此可得：<code>SC→M</code>，表示学生和课程确定名次；<code>CM→S</code>，表示课程和名次确定学生。因此候选码是 <code>(S,C)</code> 和 <code>(C,M)</code>。由于所有非平凡依赖的决定因素都是候选码，所以该模式满足BCNF。</p><hr><h2 id="第六章核心知识点总结">第六章核心知识点总结</h2><h3 id="1-函数依赖与候选码">1. 函数依赖与候选码</h3><table><thead><tr><th>概念</th><th>含义</th><th>判断方法</th></tr></thead><tbody><tr><td>函数依赖 X→Y</td><td>X的值确定后，Y的值也唯一确定</td><td>看业务语义是否“一对一确定”</td></tr><tr><td>候选码</td><td>能推出全部属性，且自身没有多余属性的属性集</td><td>求属性闭包X+，若X+=U且去掉任一属性后不能推出U，则为候选码</td></tr><tr><td>主属性</td><td>出现在任一候选码中的属性</td><td>先求候选码，再判断属性是否属于候选码</td></tr><tr><td>非主属性</td><td>不出现在任何候选码中的属性</td><td>常用于判断2NF、3NF</td></tr></tbody></table><h3 id="2-范式判断">2. 范式判断</h3><table><thead><tr><th>范式</th><th>核心条件</th><th>主要解决的问题</th></tr></thead><tbody><tr><td>1NF</td><td>属性值不可再分</td><td>消除重复组和多值属性</td></tr><tr><td>2NF</td><td>在1NF基础上，非主属性完全依赖于候选码</td><td>消除非主属性对组合码的部分依赖</td></tr><tr><td>3NF</td><td>在2NF基础上，非主属性不传递依赖于候选码</td><td>消除非主属性的传递依赖</td></tr><tr><td>BCNF</td><td>每个非平凡函数依赖X→Y中，X都必须是超码</td><td>比3NF更严格，进一步减少异常</td></tr></tbody></table><p>常用判断顺序是：先找候选码，再区分主属性和非主属性，然后检查部分依赖、传递依赖，最后检查每个决定因素是否都是超码。</p><h3 id="3-规范化要解决的问题">3. 规范化要解决的问题</h3><table><thead><tr><th>问题</th><th>含义</th><th>例子</th></tr></thead><tbody><tr><td>数据冗余</td><td>同一信息重复存储</td><td>学生姓名在多条选课记录中重复出现</td></tr><tr><td>插入异常</td><td>想插入某信息却因缺少其他信息无法插入</td><td>没有学生选课时无法插入课程信息</td></tr><tr><td>删除异常</td><td>删除某记录时误删了仍有价值的信息</td><td>删除最后一条选课记录导致课程信息丢失</td></tr><tr><td>更新异常</td><td>同一信息有多处副本，修改时容易不一致</td><td>修改课程名时漏改部分记录</td></tr></tbody></table><h3 id="4-无损连接与保持函数依赖">4. 无损连接与保持函数依赖</h3><table><thead><tr><th>特性</th><th>关注点</th><th>判断要点</th></tr></thead><tbody><tr><td>无损连接</td><td>分解后能否自然连接回原关系且不产生伪元组</td><td>对二元分解R1、R2，看公共属性是否能决定R1或R2</td></tr><tr><td>保持函数依赖</td><td>原函数依赖是否能在分解后的各子关系中直接检查</td><td>将各子关系中的依赖投影合并后，是否能推出原F</td></tr></tbody></table><p>二者没有必然联系。一个分解可以无损但不保持依赖，也可以保持依赖但有损。</p><h3 id="5-事务acid特性">5. 事务ACID特性</h3><table><thead><tr><th>特性</th><th>英文</th><th>含义</th><th>常见考法</th></tr></thead><tbody><tr><td>原子性</td><td>Atomicity</td><td>事务中的操作要么全做，要么全不做</td><td>不要和1NF的“属性原子性”混淆</td></tr><tr><td>一致性</td><td>Consistency</td><td>事务使数据库从一个一致状态转到另一个一致状态</td><td>满足完整性约束和业务规则</td></tr><tr><td>隔离性</td><td>Isolation</td><td>并发事务之间互不干扰</td><td>多用户系统像单用户一样使用</td></tr><tr><td>持久性</td><td>Durability</td><td>事务提交后影响永久保存</td><td>与日志、恢复、外存保存有关</td></tr></tbody></table><h3 id="6-并发控制与封锁">6. 并发控制与封锁</h3><table><thead><tr><th>锁类型</th><th>含义</th><th>兼容性</th></tr></thead><tbody><tr><td>S锁，共享锁</td><td>读锁，允许其他事务同时读</td><td>S锁与S锁兼容，S锁与X锁不兼容</td></tr><tr><td>X锁，排它锁</td><td>写锁，独占数据对象</td><td>X锁与任何锁都不兼容</td></tr></tbody></table><p>并发操作如果不控制，常见数据不一致包括：丢失修改、脏读、不可重复读。死锁也是并发问题，但通常不归为“数据不一致性”。</p><h3 id="7-封锁协议">7. 封锁协议</h3><table><thead><tr><th>协议</th><th>规则</th><th>能解决的问题</th><th>不能解决的问题</th></tr></thead><tbody><tr><td>一级封锁协议</td><td>修改数据前加X锁，事务结束释放</td><td>防止丢失修改</td><td>不能防止脏读、不可重复读</td></tr><tr><td>二级封锁协议</td><td>一级基础上，读数据前加S锁，读完释放</td><td>防止丢失修改、脏读</td><td>不能防止不可重复读</td></tr><tr><td>三级封锁协议</td><td>一级基础上，读数据前加S锁，事务结束释放</td><td>防止丢失修改、脏读、不可重复读</td><td>并发度较低</td></tr><tr><td>两段锁协议</td><td>加锁阶段只加锁，解锁阶段只解锁</td><td>保证可串行化</td><td>可能产生死锁</td></tr></tbody></table><h3 id="8-数据库恢复">8. 数据库恢复</h3><table><thead><tr><th>概念</th><th>含义</th></tr></thead><tbody><tr><td>日志文件</td><td>记录事务对数据库的更新，是恢复的重要依据</td></tr><tr><td>后备副本</td><td>数据库转储得到的备份文件，是介质故障恢复基础</td></tr><tr><td>REDO</td><td>对已经提交但可能未写入数据库的事务重做</td></tr><tr><td>UNDO</td><td>对未提交或失败事务的影响撤销</td></tr><tr><td>介质故障恢复</td><td>通常先用后备副本恢复，再结合日志恢复到故障前状态</td></tr></tbody></table><hr><h2 id="快速记忆口诀">快速记忆口诀</h2><ol><li>1NF看原子，2NF看部分，3NF看传递，BCNF看决定因素是不是超码。</li><li>无损看能不能还原，保持依赖看能不能继续检查依赖。</li><li>S锁可共读，X锁全排斥。</li><li>原子性是全做或全不做，一致性是状态正确，隔离性是互不影响，持久性是提交永久。</li><li>已提交事务做REDO，未完成事务做UNDO，恢复依靠日志和备份。</li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;数据库第六章作业答案&quot;&gt;数据库第六章作业答案&lt;/h1&gt;
&lt;p&gt;第六章作业，共 &lt;strong&gt;50道单选题&lt;/strong&gt;，主要覆盖关系规范化、函数依赖、无损连接与保持依赖、事务 ACID</summary>
        
      
    
    
    
    <category term="数据库" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="课程作业" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%AF%BE%E7%A8%8B%E4%BD%9C%E4%B8%9A/"/>
    
    
    <category term="数据库原理" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/"/>
    
    <category term="关系规范化" scheme="https://college-github-io.pages.dev/tags/%E5%85%B3%E7%B3%BB%E8%A7%84%E8%8C%83%E5%8C%96/"/>
    
    <category term="函数依赖" scheme="https://college-github-io.pages.dev/tags/%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96/"/>
    
    <category term="事务" scheme="https://college-github-io.pages.dev/tags/%E4%BA%8B%E5%8A%A1/"/>
    
    <category term="并发控制" scheme="https://college-github-io.pages.dev/tags/%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6/"/>
    
    <category term="数据库恢复" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%81%A2%E5%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>机器学习题库综合提取版</title>
    <link href="https://college-github-io.pages.dev/posts/a91d381c/"/>
    <id>https://college-github-io.pages.dev/posts/a91d381c/</id>
    <published>2026-06-10T04:59:12.000Z</published>
    <updated>2026-06-10T05:10:36.176Z</updated>
    
    <content type="html"><![CDATA[<h1 id="机器学习题库综合提取版">机器学习题库综合提取版</h1><p>根据原复习范围、题库导出文件和新增手机图片范围综合整理。</p><blockquote><p>使用说明：前半部分为题库原题提取，保留原题号、题干、选项、答案和解析；后半部分为图片范围中题库缺失或覆盖不充分的补充题，便于考前背诵和答题。</p></blockquote><blockquote><p>识别说明：手机图片中部分文字被反光和边框遮挡，本文按可辨识内容整合。其中“PACA”按 PCA 处理，“AKSAISZ 大小”按 batch size 大小处理。</p></blockquote><h2 id="一-整合后的范围索引">一、整合后的范围索引</h2><table><thead><tr><th>模块</th><th>覆盖考点</th><th>题库原题号</th><th>图片补充点</th></tr></thead><tbody><tr><td>机器学习任务类型、监督学习与算法选择</td><td>覆盖分类、回归、二分类、多分类、聚类、监督学习与无监督学习差异，以及算法选择依据。图片中“房价、肿瘤、信用卡、身高体重”等场景也归入本节。</td><td>1、14、15、16、20、23、25、32、38、39、40、44、45、86、99、102、106、107、133、134、151、197</td><td>房价/肿瘤/信用卡等任务识别；KNN评价；SVM判断；PCA衡量。</td></tr><tr><td>数据预处理、特征工程、评价指标与交叉验证</td><td>覆盖数据预处理包含内容、标准化、异常值、缺失值、特征工程、交叉验证、模型评价指标、Accuracy/Precision/Recall等。</td><td>17、18、21、24、33、42、77、79、90、104、158、345</td><td>预处理、模型评价、交叉验证、准确率误区。</td></tr><tr><td>降维、PCA、特征空间与高维数据</td><td>覆盖降维概念、PCA、LDA、SVD、特征提取、平行坐标、高维特征空间与模型复杂度。图片中“PACA”按“PCA”处理。</td><td>41、48、49、57、59、61、62、63、64、80、84、89、329、330</td><td>PCA是否损失、方差贡献率、特征空间大小。</td></tr><tr><td>过拟合、欠拟合、正则化与模型复杂度</td><td>覆盖L2正则化、过拟合和欠拟合原因、解决方法、剪枝、提前终止、增加样本、Dropout、模型capacity。</td><td>34、36、73、76、92、94、96、103、108、119、137、138、257、263、265、329、330</td><td>过拟合/欠拟合、L2正则化、模型复杂度。</td></tr><tr><td>集成学习、Bootstrap、Bagging、Boosting与随机森林</td><td>覆盖集成学习原理、基学习器关联性、多样性、Bootstrap采样、随机森林构建过程。</td><td>93、105、118、119、120、121、122、126、127、128、129、130、131、132、140、141</td><td>集成学习、随机森林构建、基学习器差异。</td></tr><tr><td>聚类、K-means、层次聚类与DBSCAN</td><td>覆盖K均值概念、K值确定、聚类质量评价、轮廓系数、层次聚类、DBSCAN、图像分割等。</td><td>142、143、144、145、146、147、148、149、150、151、152、153、154、155、156、157、158、159、160、161、162、168、169、170、171、172、173、177、179、180、181、182、183、184、186、199</td><td>K均值、聚类质量、轮廓系数、层次聚类。</td></tr><tr><td>贝叶斯概率、贝叶斯网络与朴素贝叶斯</td><td>覆盖先验概率、后验概率、联合概率、条件独立、贝叶斯网络、朴素贝叶斯基本假设和应用。</td><td>298、299、300、301、302、303、304、305、306、307、308、309、310、311、312、313、314、315、316、317、318、319、320、321、322</td><td>先验/后验/联合概率、朴素贝叶斯基本假设。</td></tr><tr><td>支持向量机SVM、超平面、软间隔与核函数</td><td>覆盖SVM概念、支持向量、margin、超平面、软间隔、核函数、线性不可分问题和核函数选择。</td><td>328、329、330、331、332、333、334、335、336、337、338、339、340、341、342、343、344、345、346、347、348</td><td>SVM是否只能线性、软间隔、核函数。</td></tr><tr><td>梯度下降、神经网络、深度学习与梯度消失</td><td>覆盖梯度下降迭代过程、是否能找到全局最优、神经网络训练、激活函数、batch size、深度学习与传统机器学习对比。</td><td>35、251、255、257、259、260、261、262、263、264、265、271、272、273、274、275、276、277、278、282、283、296、297</td><td>梯度下降类型、全局最优、梯度消失、batch size。</td></tr><tr><td>文本特征、图像分割与NLP拓展题</td><td>图片中出现“图像特征提取、序列数据模型”等拓展表述，题库中较接近的是文本特征、情感分析、图像分割等题。</td><td>159、188、189、190、191、195、196、197、198</td><td>图像分割、文本特征、序列数据模型拓展。</td></tr></tbody></table><h2 id="一-机器学习任务类型-监督学习与算法选择">一、机器学习任务类型、监督学习与算法选择</h2><blockquote><p>匹配范围：覆盖分类、回归、二分类、多分类、聚类、监督学习与无监督学习差异，以及算法选择依据。图片中“房价、肿瘤、信用卡、身高体重”等场景也归入本节。</p></blockquote><blockquote><p>本节题库原题号：1、14、15、16、20、23、25、32、38、39、40、44、45、86、99、102、106、107、133、134、151、197</p></blockquote><h3 id="1-以下哪种机器学习任务属于无监督学习？">1、以下哪种机器学习任务属于无监督学习？</h3><ul><li><p>A、 图像分类</p></li><li><p>B、 聚类分析</p></li><li><p>C、 情感分析</p></li><li><p>D、 语音识别</p></li></ul><p><strong>答案： B</strong></p><blockquote><p>解析：无监督学习的目标是从未标记数据中发现潜在结构，聚类分析是典型的无监督学习任务。图像分类、情感分析、语音识别均属于监督学习任务。</p></blockquote><hr><h3 id="14-下列属于有监督算法的是">14、下列属于有监督算法的是（ ）</h3><ul><li><p>A、 决策树</p></li><li><p>B、 K-均值</p></li><li><p>C、 贝叶斯网路</p></li><li><p>D、 SVM</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="15-机器学习在自然语言处理领域的应用不包括">15、机器学习在自然语言处理领域的应用不包括（ ）。</h3><ul><li><p>A、 问答系统</p></li><li><p>B、 信息收取</p></li><li><p>C、 病理分析</p></li><li><p>D、 实时翻译</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="16-机器学习是人工智能里面一个非常重要的技术-深度学习是机器学习里面的一种方法">16、机器学习是人工智能里面一个非常重要的技术，深度学习是机器学习里面的一种方法。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="20-移动运营商对客户进行细分-设计套餐和营销活动可以使用下面哪种机器学习方法">20、移动运营商对客户进行细分,设计套餐和营销活动可以使用下面哪种机器学习方法( )。</h3><ul><li><p>A、 贝叶斯分类器</p></li><li><p>B、 关联方法</p></li><li><p>C、 聚类算法</p></li><li><p>D、 多层前馈网络</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="23-移动运营商对客户的流失进行预测-可以使用下面哪种机器学习方法比较合适">23、移动运营商对客户的流失进行预测,可以使用下面哪种机器学习方法比较合适 ( )。</h3><ul><li><p>A、 一元线性回归分析</p></li><li><p>B、 关联方法</p></li><li><p>C、 聚类方法</p></li><li><p>D、 多层前馈网络</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="25-下列哪些分析需要机器学习">25、下列哪些分析需要机器学习( )。</h3><ul><li><p>A、 预测移动运营商用户未来使用的网络流量</p></li><li><p>B、 比较不同移动运营商用户对漫游业务的使用量</p></li><li><p>C、 寻找移动运营商用户对某类套餐使用的潜在客户</p></li><li><p>D、 统计移动运营商的用户在某段时间对短信的使用数量</p></li></ul><p><strong>答案： AC</strong></p><hr><h3 id="32-机器学习能解决哪些问题-每一类使用的常用方法有哪些-举例说明其应用">32、机器学习能解决哪些问题?每一类使用的常用方法有哪些?举例说明其应用。</h3><p><strong>答案：</strong></p><p>分类：逻辑回归、决策树、 KNN、随机森林、支持向量机、朴素贝叶斯</p><p>数字预测：线性回归、 KNN、Gradient Boosting、AdaBoost</p><p>无监督学习：聚类、关联分析</p><p>强化学习</p><hr><h3 id="38-机器学习在自然语言处理领域的应用不包括">38、机器学习在自然语言处理领域的应用不包括（ ）。</h3><ul><li><p>A、 问答系统</p></li><li><p>B、 信息收取</p></li><li><p>C、 病例分析</p></li><li><p>D、 实时翻译</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="39-下列属于有监督算法的是">39、下列属于有监督算法的是（ ）。</h3><ul><li><p>A、 决策树</p></li><li><p>B、 K-均值</p></li><li><p>C、 贝叶斯网络</p></li><li><p>D、 SVM</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="40-电影投资金额和电影收入之间的关系可以用一个一元线性回归方程来表示-下列说法正确的是">40、电影投资金额和电影收入之间的关系可以用一个一元线性回归方程来表示，下列说法正确的是（ ）。</h3><ul><li><p>A、 投资越多收入越少</p></li><li><p>B、 投资越少收入越多</p></li><li><p>C、 投资越多收入越多</p></li><li><p>D、 投资和收入的关系不确定</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="44-分析营销投入与销售收入的关系可以使用下面哪种数据挖掘方法">44、分析营销投入与销售收入的关系可以使用下面哪种数据挖掘方法( )。</h3><ul><li><p>A、 关联分析</p></li><li><p>B、 回归分析</p></li><li><p>C、 聚类方法</p></li><li><p>D、 推荐算法</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="45-下面哪个回归分析的说法是正确的">45、下面哪个回归分析的说法是正确的( )。</h3><ul><li><p>A、 回归分析是分析一个变量与其他一个(或几个)变量之间的线性关系的统计方法</p></li><li><p>B、 回归分析不需要样本训练</p></li><li><p>C、 不可以预测非数据型属性的类别</p></li><li><p>D、 非线性回归方程一般要转化为线性回归方程才比较容易求解其中的参数</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="86-逻辑回归为什么可以预测新样本的类别-举例说明其应用">86、逻辑回归为什么可以预测新样本的类别?举例说明其应用。</h3><p><strong>答案：</strong></p><p>逻辑回归是一种预测分析， 解释因变量与一个或多个自变量之间的关与线性回归不同之处就是它的目标变量有几种类别，所以逻辑回归主要用于解决分类问题，与线性回归相比，它是用概率的方式，预测出来属于某一分类的概率值。如果超过 50%，则属于某一分类。</p><hr><h3 id="99-在分类型机器学习过程中-下面有关分类算法的选择说法错误的是">99、在分类型机器学习过程中,下面有关分类算法的选择说法错误的是( )。</h3><ul><li><p>A、 算法参数是默认调好的,分析过程不需要修改</p></li><li><p>B、 分类算法的优劣需要通过实验比较才能确定</p></li><li><p>C、 分类算法对数据有一定的要求,一种算法不能解决所有的分类问题</p></li><li><p>D、 分类算法的结果只要训练样本准确度高就可以使用了</p></li></ul><p><strong>答案： AD</strong></p><hr><h3 id="102-从历史的样本分析中分析某个应聘者是否能适合某个岗位-以指导招聘人员选拨新员工-需要以下哪种分析">102、从历史的样本分析中分析某个应聘者是否能适合某个岗位,以指导招聘人员选拨新员工,需要以下哪种分析( )。</h3><ul><li><p>A、 分类分析</p></li><li><p>B、 回归分析</p></li><li><p>C、 聚类</p></li><li><p>D、 内容检索</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="106-如果从员工的日常表现数据预测其升职的可能性可以使用下面哪种机器学习方法">106、如果从员工的日常表现数据预测其升职的可能性可以使用下面哪种机器学习方法( )。</h3><ul><li><p>A、 关联分析</p></li><li><p>B、 线性回归分析</p></li><li><p>C、 聚类分析</p></li><li><p>D、 决策树 类算法</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="107-有监督的学习和无监督的学习的根本区别在于">107、有监督的学习和无监督的学习的根本区别在于( )。</h3><ul><li><p>A、 学习过程是否需要人工干预</p></li><li><p>B、 学习样本是否需要人工标记</p></li><li><p>C、 学习结果是否需要人工解释</p></li><li><p>D、 学习参数是否需要人工设置</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="133-分类解决什么问题">133、分类解决什么问题?</h3><p><strong>答案：</strong></p><p>分类算法是利用训练样本集获得分类函数即分类模型 (分类器)，从而实现将数据集中的样本划分到各个类中。</p><p>分类模型通过学习训练样本中属性集与类别之间的潜在关系，并以此为依据对新样本属于哪一类进行预测。</p><hr><h3 id="134-常用的分类算法包括">134、常用的分类算法包括（ ）。</h3><ul><li><p>A、 决策树</p></li><li><p>B、 支持向量机</p></li><li><p>C、 贝叶斯网络</p></li><li><p>D、 神经网络</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="151-有关机器学习算法选择的说法不正确的有">151、有关机器学习算法选择的说法不正确的有( )。</h3><ul><li><p>A、 每种算法都有其使用范围,因此选择算法需要考虑具体处理的问题</p></li><li><p>B、 判断机器学习算法好坏在数据需求阶段就可以确定</p></li><li><p>C、 在分类前可以先做聚类分析</p></li><li><p>D、 对聚类问题可以任选一种聚类算法</p></li></ul><p><strong>答案： BD</strong></p><hr><h3 id="197-下列关于情感分析的说明正确的是">197、下列关于情感分析的说明正确的是（ ）。</h3><ul><li><p>A、 常用神经网络来判断情感</p></li><li><p>B、 “他是一个乐于助人的小朋友”，这句话的情感是是负向的</p></li><li><p>C、 情感分析属于分类问题</p></li><li><p>D、 “明天可能会下雪”这句话的情感是正向的</p></li></ul><p><strong>答案： C</strong></p><hr><h2 id="二-数据预处理-特征工程-评价指标与交叉验证">二、数据预处理、特征工程、评价指标与交叉验证</h2><blockquote><p>匹配范围：覆盖数据预处理包含内容、标准化、异常值、缺失值、特征工程、交叉验证、模型评价指标、Accuracy/Precision/Recall等。</p></blockquote><blockquote><p>本节题库原题号：17、18、21、24、33、42、77、79、90、104、158、345</p></blockquote><h3 id="17-以下哪个步骤将原始数据进行变换-变量相关性-标准化等任务">17、以下哪个步骤将原始数据进行变换、变量相关性、标准化等任务( )。</h3><ul><li><p>A、 部署</p></li><li><p>B、 业务需求分析</p></li><li><p>C、 数据预处理</p></li><li><p>D、 结果评估</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="18-数据预处理对机器学习是很重要的-下面说法正确的是">18、数据预处理对机器学习是很重要的,下面说法正确的是( )。</h3><ul><li><p>A、 数据预处理的效果直接决定了机器学习的结果质量</p></li><li><p>B、 数据噪声对神经网络的训练没什么影响</p></li><li><p>C、 对于有问题的数据都直接删除即可</p></li><li><p>D、 预处理不需要花费大量的时间</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="21-以下哪个步骤不是机器学习所需的预处理工作">21、以下哪个步骤不是机器学习所需的预处理工作( )。</h3><ul><li><p>A、 数值属性的标准化</p></li><li><p>B、 变量相关性分析</p></li><li><p>C、 异常值分析</p></li><li><p>D、 与用户讨论分析需求</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="24-对于机器学习中的原始数据-存在的问题可能有">24、对于机器学习中的原始数据,存在的问题可能有( )。</h3><ul><li><p>A、 错误值</p></li><li><p>B、 重复</p></li><li><p>C、 异常值</p></li><li><p>D、 不完整</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="33-举例说明机器学习的基本过程-并举例说明基本步骤各有哪些方法">33、举例说明机器学习的基本过程，并举例说明基本步骤各有哪些方法。</h3><p><strong>答案：</strong></p><p>定义分析目标、收集数据、数据预处理、数据建模、模型训练、模型评估、模型应用</p><hr><h3 id="42-特征工程不包括">42、特征工程不包括（ ）。</h3><ul><li><p>A、 特征构建</p></li><li><p>B、 特征合并</p></li><li><p>C、 特征选择</p></li><li><p>D、 特征提取</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="77-什么是交叉校验-常用的交叉校验方法有哪些">77、 什么是交叉校验 ?常用的交叉校验方法有哪些?</h3><p><strong>答案：</strong></p><p>在一般情况下将数据集随机切分为训练集、验证集和测试集三部分。</p><p>训练集用来训练模型，验证集用于训练过程中模型的验证和选择，如果有多个模型，选择其中最小预测误差的模型，而测试集用于对最终训练完成的模型进行评估。</p><p>在实际应用中，数据往往并不充足，此时可以采用交叉验证的方法，将训练集切分成很多份，然后进行组合，以扩大可用训练集的数量，按照样本切分和组合方式。</p><p>交叉验证分为以下几种： HoldOut检验、简单交叉检验、k折交叉检验、留一交叉检验。</p><hr><h3 id="79-如何评价一个算法的性能？">79、如何评价一个算法的性能？</h3><p><strong>答案：</strong></p><p>不同算法有不同的评价指标。</p><p>例如分类算法评价指标有：准确率、准确率、召回率、 F1值、ROC曲线等。</p><p>回归模型的评价指标有：平均绝对偏差（ MAE）、均方误差（MSE）、R2指标等</p><hr><h3 id="90-特征工程不包括">90、特征工程不包括（ ）。</h3><ul><li><p>A、 特征构建</p></li><li><p>B、 特征合并</p></li><li><p>C、 特征选择</p></li><li><p>D、 特征提取</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="104-有关决策树与特征工程的关系-以下说法错误的是">104、有关决策树与特征工程的关系,以下说法错误的是( )。</h3><ul><li><p>A、 决策树可以得到对分类重要的属性,因此可以作为分类特征获取的一种方法</p></li><li><p>B、 如果要了解影响签署合同快慢的主要因素,可以使用决策树算法</p></li><li><p>C、 决策树获得的特征可以作为其他算法(例如回归算法的自变量)输入的依据</p></li><li><p>D、 决策树获得的特征是区分不同类别的最优特征</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="158-关于数据预处理对聚类分析的影响的错误说法是">158、关于数据预处理对聚类分析的影响的错误说法是( )。</h3><ul><li><p>A、 可能改变数据点之间的位置关系</p></li><li><p>B、 可能改变簇的个数</p></li><li><p>C、 有助于提升聚类质量</p></li><li><p>D、 可能产生不确定影响</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="345-使用支持向量机检测信用卡欺诈的案例中对数据进行的处理包括">345、使用支持向量机检测信用卡欺诈的案例中对数据进行的处理包括（ ）。</h3><ul><li><p>A、 载入数据</p></li><li><p>B、 分割数据</p></li><li><p>C、 标准化数据</p></li><li><p>D、 处理缺失数据</p></li></ul><p><strong>答案： ABC</strong></p><blockquote><p>解析：</p></blockquote><hr><h2 id="三-降维-pca-特征空间与高维数据">三、降维、PCA、特征空间与高维数据</h2><blockquote><p>匹配范围：覆盖降维概念、PCA、LDA、SVD、特征提取、平行坐标、高维特征空间与模型复杂度。图片中“PACA”按“PCA”处理。</p></blockquote><blockquote><p>本节题库原题号：41、48、49、57、59、61、62、63、64、80、84、89、329、330</p></blockquote><h3 id="41-下列关于pca和lda的描述正确是">41、下列关于PCA和LDA的描述正确是（ ）。</h3><ul><li><p>A、 PCA和LDA都可对高维数据进行降维</p></li><li><p>B、 PCA可以保留类的信息</p></li><li><p>C、 LDA可以保留类的信息</p></li><li><p>D、 PCA一般选择方差大的方向进行投影</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="48-下面关于主成分分析pca的描述中错误的是">48、下面关于主成分分析PCA的描述中错误的是( )。</h3><ul><li><p>A、 PCA是从原空间中顺序找一组相互正交的坐标轴</p></li><li><p>B、 原始数据中方差最大的方向是第一个坐标轴</p></li><li><p>C、 基于特征值分解协方差矩阵实现PCA算法</p></li><li><p>D、 奇异值分解只能适用于指定维数的矩阵分解</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="49-下面关于奇异值分解-svd-的描述中错误的是">49、下面关于奇异值分解(SVD)的描述中错误的是 ( )。</h3><ul><li><p>A、 奇异值分解就是把一个线性变换分解成两个线性变换</p></li><li><p>B、 奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关</p></li><li><p>C、 SVD是对PCA的改进,其计算成本更低,相同之处是两者的目标都是为了降维</p></li><li><p>D、 奇异值不仅可以应用在数据压缩上，还可以对图像去噪</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="57-适合可视化高维数据的方法是">57、适合可视化高维数据的方法是( )。</h3><ul><li><p>A、 圆饼图</p></li><li><p>B、 散点图</p></li><li><p>C、 平行坐标</p></li><li><p>D、 直方图</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="59-特征选择与特征提取的关系是">59、特征选择与特征提取的关系是( )。</h3><ul><li><p>A、 特征提取包含特征选择</p></li><li><p>B、 特征选择包含特征提取</p></li><li><p>C、 一码事,说法不同而已</p></li><li><p>D、 It is like comparing apples and oranges</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="61-在pca变换中-应尽量把数据向什么方向投影">61、在PCA变换中,应尽量把数据向什么方向投影( )。</h3><ul><li><p>A、 数据集中的方向</p></li><li><p>B、 数据散布大的方向</p></li><li><p>C、 数据分组特征明显的方向</p></li><li><p>D、 平行于原始坐标轴的方向</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="62-pca变换中不包含以下哪一种操作">62、PCA变换中不包含以下哪一种操作( )。</h3><ul><li><p>A、 去均值</p></li><li><p>B、 矩阵特征值分解</p></li><li><p>C、 属性值标准化</p></li><li><p>D、 坐标变换</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="63-假设样本数大于维数-利用pca技术-可以把n维数据降到">63、假设样本数大于维数,利用PCA技术,可以把N维数据降到( )。</h3><ul><li><p>A、 只能到1维</p></li><li><p>B、 只能到N-1维</p></li><li><p>C、 1到N-1维</p></li><li><p>D、 取决于样本的类别数</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="64-如果将pca应用于带标签的分类数据">64、如果将PCA应用于带标签的分类数据( )。</h3><ul><li><p>A、 程序直接崩溃</p></li><li><p>B、 效果杠杠的</p></li><li><p>C、 驴唇不对马嘴</p></li><li><p>D、 视情况而定</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="80-数据降维有哪些常用的方法？">80、数据降维有哪些常用的方法？</h3><p><strong>答案：</strong></p><p>主成分分析</p><p>线性判别分析</p><p>奇异值分解</p><p>局部线性嵌入</p><p>拉普拉斯特征映射</p><hr><h3 id="84-特征提取有哪些常用的方法">84、特征提取有哪些常用的方法（ ）。</h3><ul><li><p>A、 主成分分析</p></li><li><p>B、 独立成分分析</p></li><li><p>C、 线性判别分析</p></li><li><p>D、 线性回归分析</p></li></ul><p><strong>答案： ABC</strong></p><hr><h3 id="89-下列关于pca和lda的描述正确是">89、下列关于PCA和LDA的描述正确是（ ）。</h3><ul><li><p>A、 PCA和LDA都可对高维数据进行降维</p></li><li><p>B、 PCA可以保留类的信息</p></li><li><p>C、 LDA可以保留类的信息</p></li><li><p>D、 PCA一般选择方差大的方向进行投影</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="329-一个分类模型的capacity指的是">329、一个分类模型的capacity指的是（ ）。</h3><ul><li><p>A、 能够解决几分类问题</p></li><li><p>B、 能解决多大规模的问题</p></li><li><p>C、 能将多少个点分开，不论如何分配标签</p></li><li><p>D、 能达到的精确度</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="330-为什么当两个模型的训练误差相同或接近的时候-通常会选择比较简单的一个">330、为什么当两个模型的训练误差相同或接近的时候，通常会选择比较简单的一个（ ）。</h3><ul><li><p>A、 复杂模型的测试误差一定较大</p></li><li><p>B、 简单模型的测试误差一定较小</p></li><li><p>C、 在相同置信度条件下，复杂模型的测试误差上界较大</p></li><li><p>D、 只是一种经验，并没有理论依据</p></li></ul><p><strong>答案： C</strong></p><hr><h2 id="四-过拟合-欠拟合-正则化与模型复杂度">四、过拟合、欠拟合、正则化与模型复杂度</h2><blockquote><p>匹配范围：覆盖L2正则化、过拟合和欠拟合原因、解决方法、剪枝、提前终止、增加样本、Dropout、模型capacity。</p></blockquote><blockquote><p>本节题库原题号：34、36、73、76、92、94、96、103、108、119、137、138、257、263、265、329、330</p></blockquote><h3 id="34-讨论数据数量和质量对机器学习的影响">34、讨论数据数量和质量对机器学习的影响</h3><p><strong>答案：</strong></p><p>机器学习需要一定数量的数据作为支撑。</p><p>数据量过多会耗费更多的计算资源，还可能有不平衡数据集、维度灾难等问题。</p><p>数据量过少会导致机器学习的准确率下降，甚至不能完成学习的目标。</p><p>数据数量和质量问题会导致过拟合或欠拟合的现象，优秀的数据集对机器学习的结果影响是决定性的</p><hr><h3 id="36-讨论目前机器学习应用中存在的主要问题">36、讨论目前机器学习应用中存在的主要问题。</h3><p><strong>答案：</strong></p><p>选择什么模型或算法、选择什么优化方法、</p><p>如何对数据进行预处理、目标函数是什么、</p><p>过拟合与欠拟合的处理、维度爆炸</p><hr><h3 id="73-什么是正则化-正则化有什么功能">73、什么是正则化?正则化有什么功能?</h3><p><strong>答案：</strong></p><p>正则化是为了避免过拟合的手段。</p><p>正则化为了结构风险最小化，在经验风险上加一个正则化项或惩罚项，正则化项一般是模型复杂度的单调递增函数，模型越复杂，正则化值就越大。</p><hr><h3 id="76-如何理解-l0-l1-和-l2-正则化">76、 如何理解 L0 、 L1 和 L2 正则化 ?</h3><p><strong>答案：</strong></p><p>L0 正则化是通过限制向量中非 0 的元素的个数实现模型优化，用 L0 来正则化一个参数矩阵 W ，目标是使其更稀疏，即 W 中的大部分元素都是 0 。</p><p>很明显，如果通过最小化 L0 范数作为罚项，就是寻找最优的稀疏特征项。</p><p>L1 正则化是通过对向量中各个元素绝对值之和进行限制，任何的规则化算子，如果在 的地方不可微，并且可以分解为多项式的形式，那么这个规则化算子就可以实现稀疏。</p><p>L2 正则化是指向量各元素求平方和然后求平方根，用模最小化来确保 w 的每个元素都很小，都接近于 0 。</p><hr><h3 id="92-创建决策树的基本原则就是简单的就是最好的-只要能实现同样的功能-决策树越简单越好">92、创建决策树的基本原则就是简单的就是最好的，只要能实现同样的功能，决策树越简单越好。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="94-使用剪枝的方法可以避免决策树发生过拟合的问题-一般是从叶子节点开始合并">94、使用剪枝的方法可以避免决策树发生过拟合的问题，一般是从叶子节点开始合并。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="96-下面有关过拟合的认识错误的是">96、下面有关过拟合的认识错误的是( )。</h3><ul><li><p>A、 过拟合是因为训练样本太多了,把训练样本的规律都拟合进去了,因此检测样本的准确率也很高</p></li><li><p>B、 减少过拟合的方法可以通过降低决策树的复杂度,例如减少决策树的深度</p></li><li><p>C、 判断模型是否过拟合可以看随着训练的增加,学习到的模型准确度高了,但检测样本的准确率下降</p></li><li><p>D、 分类算法都可能会遇到过拟合现象</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="103-下面有关决策树剪枝的说法错误的是">103、下面有关决策树剪枝的说法错误的是( )。</h3><ul><li><p>A、 决策树剪枝的目的是为了减少训练过程的过拟合,从而提升决策树模型的准确性</p></li><li><p>B、 决策树剪枝可以放在决策树的构造过程(预剪枝),也可以等决策树模型全部建立后再做(后剪枝)</p></li><li><p>C、 决策树剪枝的依据是看某层某个非叶节点转换成叶节点后,训练样本集的检验准确度是否提升</p></li><li><p>D、 决策树剪枝符合Occam剃刀原理(即机器学习模型越简单越好)</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="108-下列哪一种情况被称为过学习现象">108、下列哪一种情况被称为过学习现象( )。</h3><ul><li><p>A、 在训练集上A优于B,在测试集上A也优于B</p></li><li><p>B、 在训练集上A优于B,在测试集上B优于A</p></li><li><p>C、 相对于分类数据集,决策树过于简单</p></li><li><p>D、 在训练集上决策树的误差很小</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="119-装袋法中每个样本被选中概率相同-所以噪声数据的影响下降-容易受过拟合的影响">119、装袋法中每个样本被选中概率相同,所以噪声数据的影响下降,容易受过拟合的影响( )。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="137-如何减少过拟合">137、 如何减少过拟合?</h3><p><strong>答案：</strong></p><p>解决过拟合问题，一方面要注意数据训练集的质量，选取具有代表性样本的训练样本集。</p><p>另一方面要避免决策树过度增长，通过限制树的深度来减少数据中的噪声对于决策树构建的影响，一般可以采取剪枝的方法。</p><hr><h3 id="138-在决策树的训练过程中-如果通过剪枝减少过拟合-举例说明">138、在决策树的训练过程中，如果通过剪枝减少过拟合?举例说明。</h3><p><strong>答案：</strong></p><p>剪枝是用来缩小决策树的规模，从而降低最终算法的复杂度并提高预测准确度，包括预剪枝和后剪枝两类。</p><p>预剪枝的思路是提前终止决策树的增长，在形成完全拟合训练样本集的决策树之前就停止树的增长，避免决策树规模过大而产生过拟合。</p><p>后剪枝策略先让决策树完全生长，之后针对子树进行判断，用叶子结点或者子树中最常用的分支替换子树，以此方式不断改进决策树，直至无法改进为止。</p><hr><h3 id="257-使用提前终止的方法可以防止过拟合现象的发生">257、使用提前终止的方法可以防止过拟合现象的发生。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="263-通过增加样本数可以减少过拟合的发生-常用的方法有以下几种">263、通过增加样本数可以减少过拟合的发生,常用的方法有以下几种( )。</h3><ul><li><p>A、 从数据源采集更多的数据</p></li><li><p>B、 复制原有数据并添加随机噪声</p></li><li><p>C、 重(复)采样</p></li><li><p>D、 根据现有样本估计样本的分布,然后按照此分布再产生一些样本</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="265-下列哪些方法可以用来降低深度学习模型的过拟合问题">265、下列哪些方法可以用来降低深度学习模型的过拟合问题( )。</h3><ul><li><p>A、 增加更多的数据</p></li><li><p>B、 提前停止训练</p></li><li><p>C、 Dropout</p></li><li><p>D、 正则化代价函数</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="329-一个分类模型的capacity指的是">329、一个分类模型的capacity指的是（ ）。</h3><ul><li><p>A、 能够解决几分类问题</p></li><li><p>B、 能解决多大规模的问题</p></li><li><p>C、 能将多少个点分开，不论如何分配标签</p></li><li><p>D、 能达到的精确度</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="330-为什么当两个模型的训练误差相同或接近的时候-通常会选择比较简单的一个">330、为什么当两个模型的训练误差相同或接近的时候，通常会选择比较简单的一个（ ）。</h3><ul><li><p>A、 复杂模型的测试误差一定较大</p></li><li><p>B、 简单模型的测试误差一定较小</p></li><li><p>C、 在相同置信度条件下，复杂模型的测试误差上界较大</p></li><li><p>D、 只是一种经验，并没有理论依据</p></li></ul><p><strong>答案： C</strong></p><hr><h2 id="五-集成学习-bootstrap-bagging-boosting与随机森林">五、集成学习、Bootstrap、Bagging、Boosting与随机森林</h2><blockquote><p>匹配范围：覆盖集成学习原理、基学习器关联性、多样性、Bootstrap采样、随机森林构建过程。</p></blockquote><blockquote><p>本节题库原题号：93、105、118、119、120、121、122、126、127、128、129、130、131、132、140、141</p></blockquote><h3 id="93-随机森林的2个随机是指">93、随机森林的2个随机是指（ ）。</h3><ul><li><p>A、 样本随机选择</p></li><li><p>B、 决策树的个数随机选择</p></li><li><p>C、 样本属性随机选择</p></li><li><p>D、 决策树的深度随机选择</p></li></ul><p><strong>答案： AC</strong></p><hr><h3 id="105-通过聚集多个决策树模型来提高分类准确率的技术称为">105、通过聚集多个决策树模型来提高分类准确率的技术称为( )。</h3><ul><li><p>A、 合并</p></li><li><p>B、 聚集</p></li><li><p>C、 集成</p></li><li><p>D、 加权求和</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="118-装袋法的原理是通过组合多个训练集的分类结果来提升分类效果">118、装袋法的原理是通过组合多个训练集的分类结果来提升分类效果( )。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="119-装袋法中每个样本被选中概率相同-所以噪声数据的影响下降-容易受过拟合的影响">119、装袋法中每个样本被选中概率相同,所以噪声数据的影响下降,容易受过拟合的影响( )。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="120-下列对提升法的描述正确的是">120、下列对提升法的描述正确的是( )。</h3><ul><li><p>A、 每个单独训练样本都会被分配一个相同的初始权重</p></li><li><p>B、 增加分类正确样本的权重,降低分类错误样本的权重来提来分类器的准确率</p></li><li><p>C、 降低分类正确样本的权重,增加分类错误样本的权重来提来分类器的准确率</p></li><li><p>D、 如何组合每一轮产生的分类模型得出预测结果是提升法需要解决的问题</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="121-下列关于随机森林的描述正确的是">121、下列关于随机森林的描述正确的是( )。</h3><ul><li><p>A、 与袋装法采用相同样本抽取方式</p></li><li><p>B、 每次从所有属性中随机抽取t个属性来训练分类器</p></li><li><p>C、 每次从所有样本中选取一定比例的样本来训练分类器</p></li><li><p>D、 可以使用不同的决策树的组合来构建分类模型</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="122-随机森林的2个随机指的是">122、随机森林的2个随机指的是( )。</h3><ul><li><p>A、 随机选取样本</p></li><li><p>B、 随机选取分类器</p></li><li><p>C、 随机选取权重</p></li><li><p>D、 随机选取属性</p></li></ul><p><strong>答案： AD</strong></p><hr><h3 id="126-集成学习的基本原理是什么-举例说明三种集成学习的应用">126、 集成学习的基本原理是什么 ? 举例说明三种集成学习的应用。</h3><p><strong>答案：</strong></p><p>基本原理：用多种学习方法的组合来获取比原来方法更优的结果，适用于组合的算法是弱学习算法，即学习算法正确率低但集成之后的算法准确率和效率都很高。</p><p>举例：</p><p>1.装袋法：通过随机采样获取个体弱学习训练集，通过T次随机采样独立训练出T个弱学习器，通过集合策略获得强学习器。</p><p>2.随机森林：与装袋法类似获取训练集，但是随机森林所训练出的弱学习器都是决策树，并且在装袋法的随机采样的基础上又添加了特征随机选择。</p><p>3.提升法：通过算法集合将弱学习器利用加权的方式进行训练转化为强学习器</p><hr><h3 id="127-关于集成学习的说法正确的有">127、关于集成学习的说法正确的有( )。</h3><ul><li><p>A、 团结力量大</p></li><li><p>B、 尺有所短寸有所长</p></li><li><p>C、 赢者通吃</p></li><li><p>D、 一个好汉三个帮</p></li></ul><p><strong>答案： ABD</strong></p><hr><h3 id="128-关于集成学习算法的说法正确的是">128、关于集成学习算法的说法正确的是( )。</h3><ul><li><p>A、 一种并行的算法框架</p></li><li><p>B、 一种串行的算法框架</p></li><li><p>C、 一类全新的数据挖掘算法</p></li><li><p>D、 一类将已有算法进行整合的算法</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="129-以下哪些措施有助于提高基础分类的多样性">129、以下哪些措施有助于提高基础分类的多样性( )。</h3><ul><li><p>A、 采用不同的训练集</p></li><li><p>B、 采用不同类型的算法</p></li><li><p>C、 采用强的基础分类器</p></li><li><p>D、 采用不同的训练参数</p></li></ul><p><strong>答案： ABD</strong></p><hr><h3 id="130-bagging的主要特点有">130、Bagging的主要特点有( )。</h3><ul><li><p>A、 各基础分类器并行生成</p></li><li><p>B、 各基础分类器权重相同</p></li><li><p>C、 只需要较少的基础分类器</p></li><li><p>D、 基于Bootstrap采样生成训练集</p></li></ul><p><strong>答案： ABD</strong></p><hr><h3 id="131-对boosting模型的描述正确的是">131、对Boosting模型的描述正确的是( )。</h3><ul><li><p>A、 采用串行训练模式</p></li><li><p>B、 基础分类器通常应采用强分类器</p></li><li><p>C、 通过改变训练集进行有针对性的学习</p></li><li><p>D、 基础分类器采用少数服从多数原则进行集成</p></li></ul><p><strong>答案： AC</strong></p><hr><h3 id="132-对adaboost描述正确的是">132、对AdaBoost描述正确的是( )。</h3><ul><li><p>A、 可以集成出训练误差任意低的分类器</p></li><li><p>B、 基础分类器可以任意弱(准确率高于50%)</p></li><li><p>C、 通过对样本进行加权达到改变训练集的效果</p></li><li><p>D、 被当前基础分类器分错的样本的权重将会减小</p></li></ul><p><strong>答案： AB</strong></p><hr><h3 id="140-以随机森林为例-讨论为什么集成学习能否提高分类的性能">140、以随机森林为例，讨论为什么集成学习能否提高分类的性能。</h3><p><strong>答案：</strong></p><p>传统的分类方法是在一个由各种可能的函数构成的空间中寻找一个最接近实际分类函数的分类器。</p><p>可以通过聚集多个分类器的预测结果提高分类器的分类准确率，这一方法即为集成学习。</p><p>该方法由训练数据构建一组基分类器，然后通过对每个基分类器的预测进行投票来进行分类。</p><p>随机森林算法目标是通过将多个弱学习机（如单棵决策树）组合得到一个强学习机。</p><p>随机森林的每一棵决策树之间是没有关联的。在得到森林之后，当有一个新的输入样本进入的时候，就让森林中的每一棵决策树分别进行一下判断，看看这个样本应该属于哪一类，然后看看哪一类被选择最多，就预测这个样本为那一类。</p><p>这样就集成了多个分类器的分类结果，达到了更好的分类性能。</p><hr><h3 id="141-随机森林的2个随机是指">141、随机森林的2个随机是指（ ）。</h3><ul><li><p>A、 样本随机选择</p></li><li><p>B、 决策树的个数随机选择</p></li><li><p>C、 样本属性随机选择</p></li><li><p>D、 决策树的深度随机选择</p></li></ul><p><strong>答案： AC</strong></p><hr><h2 id="六-聚类-k-means-层次聚类与dbscan">六、聚类、K-means、层次聚类与DBSCAN</h2><blockquote><p>匹配范围：覆盖K均值概念、K值确定、聚类质量评价、轮廓系数、层次聚类、DBSCAN、图像分割等。</p></blockquote><blockquote><p>本节题库原题号：142、143、144、145、146、147、148、149、150、151、152、153、154、155、156、157、158、159、160、161、162、168、169、170、171、172、173、177、179、180、181、182、183、184、186、199</p></blockquote><h3 id="142-下列关于聚类标准的说法正确的是">142、下列关于聚类标准的说法正确的是（ ）。</h3><ul><li><p>A、 簇内距离和簇间聚类尽可能大</p></li><li><p>B、 簇内距离和簇间聚类尽可能小</p></li><li><p>C、 簇内距离尽量大、簇间聚类尽可能小</p></li><li><p>D、 簇内距离尽量小、簇间聚类尽可能大</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="143-下列关于聚类分析的度量标准轮廓系数的描述不准确的是">143、下列关于聚类分析的度量标准轮廓系数的描述不准确的是（ ）。</h3><ul><li><p>A、 轮廓系数的最大值是1</p></li><li><p>B、 一个簇整体的轮廓系数越大，说明聚类的效果越好</p></li><li><p>C、 轮廓系数不可能出现负数</p></li><li><p>D、 聚类紧密的簇比聚类稀疏的簇的整体轮廓系数要大</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="144-k-means算法适合对不规则形状的数据进行聚类">144、K-means算法适合对不规则形状的数据进行聚类。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="145-下列关于基于层次的聚类方法的描述不正确的是">145、下列关于基于层次的聚类方法的描述不正确的是（ ）。</h3><ul><li><p>A、 按照层次聚类的过程分为自底向上和自顶向下2大类方法</p></li><li><p>B、 如果一直重复聚类过程的话，所有的样品最后可以归为一类</p></li><li><p>C、 自底向上的聚类方法是一种分裂聚类方法</p></li><li><p>D、 无论类间距离采用哪种计算方法，最终都是将最小距离的2个簇合并</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="146-使用python的sklearn-cluster库中的dbscan算法进行聚类的时候-参数eps和min-samples的描述正确的是">146、使用Python的sklearn.cluster库中的DBSCAN算法进行聚类的时候，参数eps和min_samples的描述正确的是（ ）。</h3><ul><li><p>A、 eps越大，聚出来的类越多</p></li><li><p>B、 eps越小，聚出来的类越多</p></li><li><p>C、 min_samples越小，一个簇中包含的样本点越少</p></li><li><p>D、 min_samples越小，一个簇中包含的样本点越多</p></li></ul><p><strong>答案： ABC</strong></p><hr><h3 id="147-以下哪些数据的特征会对聚类有影响">147、以下哪些数据的特征会对聚类有影响( )。</h3><ul><li><p>A、 高维性</p></li><li><p>B、 样本规模</p></li><li><p>C、 噪声</p></li><li><p>D、 离群点</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="148-根据用户使用移动运营商的数据-可以为他们设计合适的套餐-使用哪种挖掘方法比较合适">148、根据用户使用移动运营商的数据,可以为他们设计合适的套餐,使用哪种挖掘方法比较合适( )。</h3><ul><li><p>A、 聚类</p></li><li><p>B、 回归分析</p></li><li><p>C、 神经网络</p></li><li><p>D、 关联分析</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="149-有关聚类算法不正确的说法是">149、有关聚类算法不正确的说法是( )。</h3><ul><li><p>A、 把分析的样本根据距离分组</p></li><li><p>B、 必须给出聚类的组数</p></li><li><p>C、 聚类是分类的基础</p></li><li><p>D、 聚类算法可以找出每组样本不同的特征</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="150-对联通客户进行分组-以便根据各组的特点-策划不同的营销方案-需要客户哪些数据">150、对联通客户进行分组,以便根据各组的特点,策划不同的营销方案,需要客户哪些数据( )。</h3><ul><li><p>A、 客户人口数据</p></li><li><p>B、 收入数据</p></li><li><p>C、 家庭男女组成</p></li><li><p>D、 客户长途市话以及漫游等通话数据</p></li></ul><p><strong>答案： ABD</strong></p><hr><h3 id="151-有关机器学习算法选择的说法不正确的有">151、有关机器学习算法选择的说法不正确的有( )。</h3><ul><li><p>A、 每种算法都有其使用范围,因此选择算法需要考虑具体处理的问题</p></li><li><p>B、 判断机器学习算法好坏在数据需求阶段就可以确定</p></li><li><p>C、 在分类前可以先做聚类分析</p></li><li><p>D、 对聚类问题可以任选一种聚类算法</p></li></ul><p><strong>答案： BD</strong></p><hr><h3 id="152-下列说法错误的是">152、下列说法错误的是 ( )。</h3><ul><li><p>A、 在聚类分析中,簇之间的相似性越大,簇内样本的差别越大,聚类的效果就越好</p></li><li><p>B、 聚类分析可以看作是一种非监督的样本分组过程</p></li><li><p>C、 k均值算法是一种常用的聚类算法,簇的个数算法不能自动确定</p></li><li><p>D、 k均值算法的计算耗时与初始假设聚类中心的位置有关</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="153-有关k-means下列说法正确的是">153、有关k-means下列说法正确的是( )。</h3><ul><li><p>A、 可以确定样本属性的重要性</p></li><li><p>B、 可以处理规则分布数据的聚类</p></li><li><p>C、 适合任意数据集的分组</p></li><li><p>D、 聚类的结果与初始选择的假设聚类中心无关</p></li></ul><p><strong>答案： B</strong></p><blockquote><p>解析：</p></blockquote><hr><h3 id="154-以下有关kohonen神经网络聚类模型正确的说法是">154、以下有关kohonen神经网络聚类模型正确的说法是( )。</h3><ul><li><p>A、 Kohonen神经网络的聚类过程不需要计算样本之间的距离</p></li><li><p>B、 Kohonen输入层和输出层之间的权重修正不能使用梯度下降法</p></li><li><p>C、 kohonon神经网络输出层的神经元计算类似BP神经网络的输出神经元计算</p></li><li><p>D、 Kohonon神经网络聚类的组数事先可以确定</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="155-聚类中的簇与分类中的类的关系是">155、聚类中的簇与分类中的类的关系是( )。</h3><ul><li><p>A、 簇即是类、类即是簇</p></li><li><p>B、 簇是类的一种具体表现形式</p></li><li><p>C、 类是簇的一种具体表现形式</p></li><li><p>D、 不是一码事,但实际中有一定联系</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="156-在市场营销中-聚类最有可能帮助经营者">156、在市场营销中,聚类最有可能帮助经营者( )。</h3><ul><li><p>A、 对客户群进行划分</p></li><li><p>B、 进行商品推荐</p></li><li><p>C、 进兴趣进行分类</p></li><li><p>D、 辅助商品定价</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="157-一个好的聚类算法应当具备哪些潜质">157、一个好的聚类算法应当具备哪些潜质( )。</h3><ul><li><p>A、 能够处理非球形的数据分布</p></li><li><p>B、 能够处理噪点和离群点</p></li><li><p>C、 对样本输入序列不敏感</p></li><li><p>D、 对海量数据的可扩展性</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="158-关于数据预处理对聚类分析的影响的错误说法是">158、关于数据预处理对聚类分析的影响的错误说法是( )。</h3><ul><li><p>A、 可能改变数据点之间的位置关系</p></li><li><p>B、 可能改变簇的个数</p></li><li><p>C、 有助于提升聚类质量</p></li><li><p>D、 可能产生不确定影响</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="159-在基于聚类的图像分割例子中">159、在基于聚类的图像分割例子中( )。</h3><ul><li><p>A、 色彩越复杂的图,需要的簇的个数越少</p></li><li><p>B、 属于同一个物体的像素对应同一个簇</p></li><li><p>C、 簇的个数越少,分割后图像越接近原始图像</p></li><li><p>D、 簇的个数越多,分割后图像越接近原始图像</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="160-如何衡量聚类的质量">160、如何衡量聚类的质量( )。</h3><ul><li><p>A、 簇内数据点散布越小越好</p></li><li><p>B、 簇中心点之间的距离越大越好</p></li><li><p>C、 簇的个数越小越好</p></li><li><p>D、 需要考虑数据点间的连通性</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="161-对于轮廓系数图表述正确的是">161、对于轮廓系数图表述正确的是( )。</h3><ul><li><p>A、 每个点的取值范围为[0, 1]</p></li><li><p>B、 每个点的取值越接近于0越好</p></li><li><p>C、 可以体现出簇的紧凑性</p></li><li><p>D、 对于离群点,取值可能超过1性</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="162-k-means算法中的初始中心点">162、K-Means算法中的初始中心点( )。</h3><ul><li><p>A、 可随意设置</p></li><li><p>B、 必须在每个簇的真实中心点的附近</p></li><li><p>C、 必须足够分散</p></li><li><p>D、 直接影响算法的收敛结果</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="168-与k-means相比-基于密度的dbscan的优点不包括">168、与K-Means相比,基于密度的DBSCAN的优点不包括( )。</h3><ul><li><p>A、 能妥善处理噪点和离群点</p></li><li><p>B、 能处理不规则的数据分布</p></li><li><p>C、 不需要预先设定簇的个数</p></li><li><p>D、 较低的计算复杂度</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="169-在dbscan中-对数据点类型的划分中不包括">169、在DBSCAN中,对数据点类型的划分中不包括( )。</h3><ul><li><p>A、 中心点</p></li><li><p>B、 核心点</p></li><li><p>C、 边缘点</p></li><li><p>D、 噪点</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="170-在dbscan中-对数据点类型的划分中不包括">170、在DBSCAN中,对数据点类型的划分中不包括( )。</h3><ul><li><p>A、 划分到最近的簇</p></li><li><p>B、 所有噪点单独形成一个簇</p></li><li><p>C、 直接无视</p></li><li><p>D、 不做特别区分</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="171-在层次型聚类中">171、在层次型聚类中( )。</h3><ul><li><p>A、 需要用户预先设定聚类的个数</p></li><li><p>B、 需要用户预先设定聚类个数的范围</p></li><li><p>C、 对于N个数据点,可生成1到N个簇</p></li><li><p>D、 对于N个数据点,可生成1到N/2个簇</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="172-在层次型聚类中-两个点集之间的距离计算方法通常不包括">172、在层次型聚类中,两个点集之间的距离计算方法通常不包括( )。</h3><ul><li><p>A、 由点集间距离最近的一对点的距离决定</p></li><li><p>B、 由点集间距离最远的一对点的距离决定</p></li><li><p>C、 由点集间随机的一对点的距离决定</p></li><li><p>D、 由点集间所有点的平均距离决定</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="173-在dbscan中-对噪音处理正确的是">173、在DBSCAN中,对噪音处理正确的是( )。</h3><ul><li><p>A、 划分到最近的簇</p></li><li><p>B、 所有噪点单独形成一个簇</p></li><li><p>C、 直接无视</p></li><li><p>D、 不做特别区分</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="177-聚类分析的目的是什么？">177、聚类分析的目的是什么？</h3><p><strong>答案：</strong></p><p>聚类分析用于对未知类别的样本进行划分，将它们按照一定的规则划分成若干个类族，把相似 (距高相近)的样本聚在同一个类簇中， 把不相似的样本分为不同类簇，从而揭示样本之间内在的性质以及相互之间的联系规律。</p><hr><h3 id="179-评价聚类算法的好坏可以从哪些方面入手">179、评价聚类算法的好坏可以从哪些方面入手?</h3><p><strong>答案：</strong></p><p>良好的可伸缩性、处理不同类型数据的能力、处理噪声数据的能力、对样本顺序的不敏感性、约束条件下的表现、易解释性和易用性。</p><p>具体评价指标包括外部指标如 Rand统计量、F值、Jaccard指数、FM指数等；内部指标如欧式距离、曼哈顿距离、切比雪夫距离、明科夫斯基距离、紧密度、分隔度、戴维森堡丁指数、邓恩指数等。</p><hr><h3 id="180-简要说明基于划分的聚类方法基本原理">180、 简要说明基于划分的聚类方法基本原理。</h3><p><strong>答案：</strong></p><p>基于划分的方法通过将对象划分为互斥的簇进行聚类， 每个对象属于且仅属于一个簇。</p><p>划分结果旨在使簇之间的相似性低，簇内部的相似度高。</p><hr><h3 id="181-k-均值算法的聚类数k如何确定">181、 k-均值算法的聚类数k如何确定。</h3><p><strong>答案：</strong></p><p>第一种方法：与层次聚类算法结合，先通过层次聚类算法得出大致的聚类数目，并且获得一个初始聚类结果，然后再通过 k-均值算法改进聚类结果</p><p>第二种方法：基于系统演化的方法，将数据集视为伪热力学系统，在分裂和合并过程中，将系统演化到稳定平衡状态从而确定 k值</p><hr><h3 id="182-下列关于聚类标准的说法正确的是">182、下列关于聚类标准的说法正确的是（ ）。</h3><ul><li><p>A、 簇内距离和簇间聚类尽可能大</p></li><li><p>B、 簇内距离和簇间聚类尽可能小</p></li><li><p>C、 簇内距离尽量大、簇间聚类尽可能小</p></li><li><p>D、 簇内距离尽量小、簇间聚类尽可能大</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="183-下列关于聚类分析的度量标准轮廓系数的描述不准确的是">183、下列关于聚类分析的度量标准轮廓系数的描述不准确的是（ ）。</h3><ul><li><p>A、 轮廓系数的最大值是1</p></li><li><p>B、 一个簇整体的轮廓系数越大，说明聚类的效果越好</p></li><li><p>C、 轮廓系数不可能出现负数</p></li><li><p>D、 聚类紧密的簇比聚类稀疏的簇的整体轮廓系数要大</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="184-使用python的sklearn-cluster库中的dbscan算法进行聚类的时候-参数eps和min-samples的描述正确的是">184、使用Python的sklearn.cluster库中的DBSCAN算法进行聚类的时候，参数eps和min_samples的描述正确的是（ ）。</h3><ul><li><p>A、 eps越大，聚出来的类越多</p></li><li><p>B、 eps越小，聚出来的类越多</p></li><li><p>C、 min_samples越小，一个簇中包含的样本点越少</p></li><li><p>D、 min_samples越小，一个簇中包含的样本点越多</p></li></ul><p><strong>答案： BC</strong></p><blockquote><p>解析：</p></blockquote><hr><h3 id="186-下列关于基于层次的聚类方法的描述不正确的是">186、下列关于基于层次的聚类方法的描述不正确的是（ ）。</h3><ul><li><p>A、 按照层次聚类的过程分为自底向上和自顶向下2大类方法</p></li><li><p>B、 如果一直重复聚类过程的话，所有的样品最后可以归为一类</p></li><li><p>C、 自底向上的聚类方法是一种分裂聚类方法</p></li><li><p>D、 无论类间距离采用哪种计算方法，最终都是将最小距离的2个簇合并</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="199-根据用户使用移动运营商的数据-可以为他们设计合适的套餐-使用哪种挖掘方法比较合适">199、根据用户使用移动运营商的数据,可以为他们设计合适的套餐,使用哪种挖掘方法比较合适( )。</h3><ul><li><p>A、 聚类</p></li><li><p>B、 回归分析</p></li><li><p>C、 神经网络</p></li><li><p>D、 关联分析</p></li></ul><p><strong>答案： A</strong></p><hr><h2 id="七-贝叶斯概率-贝叶斯网络与朴素贝叶斯">七、贝叶斯概率、贝叶斯网络与朴素贝叶斯</h2><blockquote><p>匹配范围：覆盖先验概率、后验概率、联合概率、条件独立、贝叶斯网络、朴素贝叶斯基本假设和应用。</p></blockquote><blockquote><p>本节题库原题号：298、299、300、301、302、303、304、305、306、307、308、309、310、311、312、313、314、315、316、317、318、319、320、321、322</p></blockquote><h3 id="298-一个人得流感头疼的概率和头疼得流感的概率是一样的">298、一个人得流感头疼的概率和头疼得流感的概率是一样的。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="299-贝叶斯网络推理就是用概率的方法进行-推理">299、贝叶斯网络推理就是用概率的方法进行（ ）推理。</h3><ul><li><p>A、 确定</p></li><li><p>B、 不确定</p></li><li><p>C、 分类</p></li><li><p>D、 聚类</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="300-贝叶斯网络由下面哪几部分组成">300、贝叶斯网络由下面哪几部分组成（ ）。</h3><ul><li><p>A、 参数θ</p></li><li><p>B、 联合概率p</p></li><li><p>C、 结构G</p></li><li><p>D、 各个变量的先验概率</p></li></ul><p><strong>答案： AC</strong></p><hr><h3 id="301-使用贝叶斯网络进行文本分类时-如果有100个单词-词汇量是50000-需要计算概率的总数是">301、使用贝叶斯网络进行文本分类时，如果有100个单词，词汇量是50000，需要计算概率的总数是（ ）。</h3><ul><li><p>A、 1000000</p></li><li><p>B、 10000000</p></li><li><p>C、 100000</p></li><li><p>D、 10000</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="302-使用贝叶斯网络进行疾病诊断的时候-一般知道先验概率时的准确率要比不知道先验概率时的准确率要高">302、使用贝叶斯网络进行疾病诊断的时候，一般知道先验概率时的准确率要比不知道先验概率时的准确率要高。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="303-已知池中有两种鱼-比例为7-3-若随机捞上一条-按照70-和30-概率随机猜测其种类-则整体误差最接近于">303、已知池中有两种鱼,比例为7:3,若随机捞上一条,按照70%和30%概率随机猜测其种类,则整体误差最接近于( )。</h3><ul><li><p>A、 20%</p></li><li><p>B、 30%</p></li><li><p>C、 40%</p></li><li><p>D、 50%</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="304-2015年10月-中国共产党第十八届中央委员会第五次全体会议公报指出-坚持计划生育基本国策-积极开展应对人口老龄化行动-实施全面二孩政策-提问-小明的妈妈有两个孩子-已知其中一个是男孩儿-问另一个也是男孩儿的概率是">304、2015年10月,中国共产党第十八届中央委员会第五次全体会议公报指出:坚持计划生育基本国策,积极开展应对人口老龄化行动,实施全面二孩政策。提问:小明的妈妈有两个孩子,已知其中一个是男孩儿,问另一个也是男孩儿的概率是( )。</h3><ul><li><p>A、 二分之一</p></li><li><p>B、 三分之一</p></li><li><p>C、 四分之一</p></li><li><p>D、 真的不关我的事</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="305-已知甲乙丙三人射击命中率分别为0-8-0-6和0-5-若每人各开一枪-则目标被命中的概率最接近">305、已知甲乙丙三人射击命中率分别为0.8,0.6和0.5,若每人各开一枪,则目标被命中的概率最接近( )。</h3><ul><li><p>A、 0.85</p></li><li><p>B、 0.90</p></li><li><p>C、 0.95</p></li><li><p>D、 1.00</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="306-当化验报告呈阳性的时候-正确的做法是">306、当化验报告呈阳性的时候,正确的做法是( )。</h3><ul><li><p>A、 心如死灰,万念俱灭</p></li><li><p>B、 散尽家财,及时行乐</p></li><li><p>C、 置若罔闻,我行我素</p></li><li><p>D、 及时复检,防止假阳性</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="307-下面有关朴素贝叶斯算法的认识错误的是">307、下面有关朴素贝叶斯算法的认识错误的是( )。</h3><ul><li><p>A、 与决策树算法不同,朴素贝叶斯模型是比较各种类别出现的概率大小确定样本的类别</p></li><li><p>B、 朴素贝叶斯算法是一种使用概率理论的非监督分类算法</p></li><li><p>C、 朴素贝叶斯模型需要先确定特征,并根据样本计算相关的先验概率,再计算特征条件下的分类变量的后验概率</p></li><li><p>D、 朴素贝叶斯模型课用于垃圾邮件分类、微博用户情感的识别等场景</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="308-有关朴素贝叶斯分类器的说法正确的是">308、有关朴素贝叶斯分类器的说法正确的是( )。</h3><ul><li><p>A、 朴素贝叶斯分类器的变量必须是非连续性变量</p></li><li><p>B、 朴素贝叶斯模型分类时需要计算属于各种类别的概率,取其中概率最大的类别最为分类预测值</p></li><li><p>C、 朴素贝叶斯模型中的特征和类别变量之间也要相互独立</p></li><li><p>D、 朴素贝叶斯分类器对于小样本数据集效果不如决策树好</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="309-朴素贝叶斯分类器的朴素之处在于">309、朴素贝叶斯分类器的朴素之处在于( )。</h3><ul><li><p>A、 只能处理低维属性</p></li><li><p>B、 只能处理离散型属性</p></li><li><p>C、 分类效果一般</p></li><li><p>D、 属性之间的条件独立性假设</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="310-以下关于两个变量x和y说法正确的是">310、以下关于两个变量X和Y说法正确的是( )。</h3><ul><li><p>A、 若独立一定不相关</p></li><li><p>B、 若不相关一定独立</p></li><li><p>C、 若独立不一定不相关</p></li><li><p>D、 我已经晕了</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="311-两个事件a和b条件独立指的是">311、两个事件A和B条件独立指的是( )。</h3><ul><li><p>A、 P(A, B)=P(A)P(B)</p></li><li><p>B、 P(A, B)=P(A|B)P(B)</p></li><li><p>C、 P(A|B, C)=P(A|C)</p></li><li><p>D、 P(A|B)=P(A)</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="312-如果两个事件独立-那么这两个事件是不相关的">312、如果两个事件独立,那么这两个事件是不相关的。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="313-以下关于拉普拉斯平滑说法正确的是">313、以下关于拉普拉斯平滑说法正确的是( )。</h3><ul><li><p>A、 防止计算条件概率时分母为零</p></li><li><p>B、 防止计算条件概率时分子为零</p></li><li><p>C、 用于解决训练集中的噪声</p></li><li><p>D、 用于解决训练集中的异常值</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="314-下面有关贝叶斯网络认识错误的是">314、下面有关贝叶斯网络认识错误的是( )。</h3><ul><li><p>A、 叶斯网络克服了朴素贝叶斯特征之间需要相互独立等不足</p></li><li><p>B、 贝叶斯网络设计过程中主要是根据领域知识确定贝叶斯网络结构、确定网络参数(条件概率表)</p></li><li><p>C、 贝叶斯网络变量之间的因果关系和相应的概率部分是人工专家指定,不需要样本训练</p></li><li><p>D、 贝叶斯网络的参数主要是条件概率表中的概率值,可以使用最大似然估计或贝叶斯估计等方法</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="315-下面有关贝叶斯网络的说法错误的有哪些">315、下面有关贝叶斯网络的说法错误的有哪些( )。</h3><ul><li><p>A、 贝叶斯网络结构可以由机器自动完成</p></li><li><p>B、 贝叶斯网络的搭建需要考虑变量之间的因果关系,这是贝叶斯网络推理的基础</p></li><li><p>C、 作为一种监督学习算法,贝叶斯网络也需要大量的样本分析变量之间的概率</p></li><li><p>D、 贝叶斯网络的推理只能由原因变量,计算其联合概率,推出目标(分类)变量的条件概率,而不能由目标变量推出原因变量的可能性</p></li></ul><p><strong>答案： AD</strong></p><hr><h3 id="316-贝叶斯网络就是使用有向无环图来表示变量间依赖关系的概率图模型">316、贝叶斯网络就是使用有向无环图来表示变量间依赖关系的概率图模型。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="317-贝叶斯网络构建的方法包括">317、贝叶斯网络构建的方法包括( )。</h3><ul><li><p>A、 根据问题和领域专家知识手工构建</p></li><li><p>B、 通过对数据进行分析得到贝叶斯网络</p></li><li><p>C、 根据问题自动创建</p></li><li><p>D、 综合领域专家知识是数据分析得到贝叶斯网络</p></li></ul><p><strong>答案： ABD</strong></p><hr><h3 id="318-贝叶斯网络学习包括参数学习和结构学习">318、贝叶斯网络学习包括参数学习和结构学习。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="319-贝叶斯网络推理方法包括">319、贝叶斯网络推理方法包括( )。</h3><ul><li><p>A、 从左至右</p></li><li><p>B、 自顶向下</p></li><li><p>C、 自底向上</p></li><li><p>D、 从右至左</p></li></ul><p><strong>答案： BC</strong></p><hr><h3 id="320-以下哪些不是贝叶斯网络的应用场景">320、以下哪些不是贝叶斯网络的应用场景( )。</h3><ul><li><p>A、 中文分词</p></li><li><p>B、 机器故障诊断</p></li><li><p>C、 招聘人才选拔规则</p></li><li><p>D、 根据客户的消费行为对其进行分组</p></li></ul><p><strong>答案： CD</strong></p><hr><h3 id="321-在文本分类应用中-关于词袋模型的描述正确的是">321、在文本分类应用中,关于词袋模型的描述正确的是( )。</h3><ul><li><p>A、 任何一个单词只能存在于某一个词袋中</p></li><li><p>B、 一个单词可能存在于多个词袋中但频率不同</p></li><li><p>C、 所有词袋中单词的并集就等同于词汇表</p></li><li><p>D、 词袋模型描述的是单词在所有文本中出现的频率</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="322-使用贝叶斯网络进行分类的时候-知道的相关信息越多-判断的准确率越高">322、使用贝叶斯网络进行分类的时候,知道的相关信息越多,判断的准确率越高。</h3><p><strong>答案： 正确</strong></p><hr><h2 id="八-支持向量机svm-超平面-软间隔与核函数">八、支持向量机SVM、超平面、软间隔与核函数</h2><blockquote><p>匹配范围：覆盖SVM概念、支持向量、margin、超平面、软间隔、核函数、线性不可分问题和核函数选择。</p></blockquote><blockquote><p>本节题库原题号：328、329、330、331、332、333、334、335、336、337、338、339、340、341、342、343、344、345、346、347、348</p></blockquote><h3 id="328-支持向量机是一个分类器-超平面上的数据是支持向量-超平面以外的数据可以辅助分类">328、支持向量机是一个分类器，超平面上的数据是支持向量，超平面以外的数据可以辅助分类。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="329-一个分类模型的capacity指的是">329、一个分类模型的capacity指的是（ ）。</h3><ul><li><p>A、 能够解决几分类问题</p></li><li><p>B、 能解决多大规模的问题</p></li><li><p>C、 能将多少个点分开，不论如何分配标签</p></li><li><p>D、 能达到的精确度</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="330-为什么当两个模型的训练误差相同或接近的时候-通常会选择比较简单的一个">330、为什么当两个模型的训练误差相同或接近的时候，通常会选择比较简单的一个（ ）。</h3><ul><li><p>A、 复杂模型的测试误差一定较大</p></li><li><p>B、 简单模型的测试误差一定较小</p></li><li><p>C、 在相同置信度条件下，复杂模型的测试误差上界较大</p></li><li><p>D、 只是一种经验，并没有理论依据</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="331-在svm领域中-margin的含义是">331、在SVM领域中，margin的含义是（ ）。</h3><ul><li><p>A、 盈利率</p></li><li><p>B、 马金</p></li><li><p>C、 间隔</p></li><li><p>D、 保证金</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="332-线性svm和一般线性分类器的区别主要是">332、线性SVM和一般线性分类器的区别主要是（ ）。</h3><ul><li><p>A、 是否进行了空间映射</p></li><li><p>B、 是否确保间隔最大化</p></li><li><p>C、 是否能处理线性不可分问题</p></li><li><p>D、 训练误差通常较低</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="333-为什么通常要选择margin最大的分类器">333、为什么通常要选择margin最大的分类器（ ）。</h3><ul><li><p>A、 所需的支持向量个数最少</p></li><li><p>B、 计算复杂度最低</p></li><li><p>C、 训练误差最低</p></li><li><p>D、 望获得较低的测试误差</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="334-假设超平面为w-x-b-0-其margin的大小为">334、假设超平面为w*x+b=0，其margin的大小为（ ）。</h3><ul><li><p>A、 1/|w|</p></li><li><p>B、 2/|w|</p></li><li><p>C、 |b|/|w|</p></li><li><p>D、 |b|/|w</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="335-支持向量-support-vectors-指的是">335、支持向量（support vectors）指的是（ ）。</h3><ul><li><p>A、 对原始数据进行采样得到的样本点</p></li><li><p>B、 决定分类面可以平移的范围的数据点</p></li><li><p>C、 位于分类面上的点</p></li><li><p>D、 能够被正确分类的数据点</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="336-svm核心技术的发展经历了">336、SVM核心技术的发展经历了（ ）。</h3><ul><li><p>A、 10年</p></li><li><p>B、 20年</p></li><li><p>C、 30年</p></li><li><p>D、 40年</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="337-在svm的求解过程中-支持向量与α的关系是">337、在SVM的求解过程中，支持向量与α的关系是（ ）。</h3><ul><li><p>A、 alpha=0的数据点是支持向量</p></li><li><p>B、 alpha&gt;0的数据点是支持向量</p></li><li><p>C、 alpha&lt;0的数据点是支持向量</p></li><li><p>D、 两者没有固定关系</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="338-在svm当中-主要的运算形式是">338、在SVM当中，主要的运算形式是（ ）。</h3><ul><li><p>A、 向量内积</p></li><li><p>B、 矩阵乘法</p></li><li><p>C、 矩阵转置</p></li><li><p>D、 矩阵分解</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="339-软间隔-soft-margin-的主要用途是">339、软间隔（soft margin）的主要用途是（ ）。</h3><ul><li><p>A、 解决线性不可分问题</p></li><li><p>B、 解决不完全线性可分问题</p></li><li><p>C、 降低算法时间复杂度</p></li><li><p>D、 提高算法分类精确</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="340-在svm当中进行空间映射的主要目的是">340、在SVM当中进行空间映射的主要目的是（ ）。</h3><ul><li><p>A、 降低计算复杂度</p></li><li><p>B、 提取较为重要的特征</p></li><li><p>C、 对原始数据进行标准化</p></li><li><p>D、 提高原始问题的可分性</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="341-对于svm-在映射后的高维空间直接进行计算的主要问题是">341、对于SVM，在映射后的高维空间直接进行计算的主要问题是（ ）。</h3><ul><li><p>A、 模型可解释性差</p></li><li><p>B、 计算复杂度高</p></li><li><p>C、 容易出现奇异矩阵</p></li><li><p>D、 容易出现稀疏矩阵</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="342-通过运用核函数-我们可以">342、通过运用核函数，我们可以（ ）。</h3><ul><li><p>A、 提高算法的可解释性</p></li><li><p>B、 生成数量较少的支持向量</p></li><li><p>C、 生成数量较多的支持向量</p></li><li><p>D、 避免高维空间运算，降低算法复杂度</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="343-常用的核函数包括">343、常用的核函数包括（ ）。</h3><ul><li><p>A、 线性核函数</p></li><li><p>B、 高斯核函数</p></li><li><p>C、 多项式核函数</p></li><li><p>D、 sigmoid和函数</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="344-使用支持向量机对新闻主题进行分类的步骤不包括">344、使用支持向量机对新闻主题进行分类的步骤不包括（ ）。</h3><ul><li><p>A、 获取数据</p></li><li><p>B、 将文本转化为向量</p></li><li><p>C、 选取特征值</p></li><li><p>D、 分割数据集</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="345-使用支持向量机检测信用卡欺诈的案例中对数据进行的处理包括">345、使用支持向量机检测信用卡欺诈的案例中对数据进行的处理包括（ ）。</h3><ul><li><p>A、 载入数据</p></li><li><p>B、 分割数据</p></li><li><p>C、 标准化数据</p></li><li><p>D、 处理缺失数据</p></li></ul><p><strong>答案： ABC</strong></p><blockquote><p>解析：</p></blockquote><hr><h3 id="346-列举支持向量机常用的3种核函数-并说明他们的优点">346、列举支持向量机常用的3种核函数，并说明他们的优点。</h3><p><strong>答案：</strong></p><p>线性核函数：主要用于线性可分的情况。</p><p>多项式核函数：一种非稳态核函数，适合于正交归一化后的数据。</p><p>径向基核函数：具有很强的灵活性，应用广泛。大多数情况下有较好的性能。</p><p>Sigmoid核：来源于MLP中的激活函数，SVM使用Sigmoid相当于一个两层的感知机网络。</p><hr><h3 id="347-作为一种分类算法-支持向量机的基本原理是什么？">347、作为一种分类算法，支持向量机的基本原理是什么？</h3><p><strong>答案：</strong></p><p>支持向量机是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器，支持向量机还包括核技巧，这使它成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化，可形式化为一个求解凸二次规划的问题，也等价于正则化的合页损失函数的最小化问题。支持向量机的学习算法是求解凸二次规划的最优化算法。</p><hr><h3 id="348-核函数的选择对支持向量机的性能有何影响">348、核函数的选择对支持向量机的性能有何影响。</h3><p><strong>答案：</strong></p><p>只要一个对称函数所对应的核矩阵半正定，它就能作为核函数使用。</p><p>事实上，对于一个半正定核矩阵，总能找到一个与之对应的映射。</p><p>核函数的使用，不一定能够准确的划分，只能说使用哪个核函数，能够逼近真实的划分效果。</p><p>因此特征空间的好坏对支持向量机的性能至关重要。在不知道特征映射的形式时，我们并不知道什么样的核函数是合适的，而核函数也仅是隐式定义了这个特征空间。</p><p>于是，核函数的选择成为了支持向量机的最大变数。若核函数选择不合适，则意味着映射到一个不合适的特征空间，很可能导致性能不佳。</p><hr><h2 id="九-梯度下降-神经网络-深度学习与梯度消失">九、梯度下降、神经网络、深度学习与梯度消失</h2><blockquote><p>匹配范围：覆盖梯度下降迭代过程、是否能找到全局最优、神经网络训练、激活函数、batch size、深度学习与传统机器学习对比。</p></blockquote><blockquote><p>本节题库原题号：35、251、255、257、259、260、261、262、263、264、265、271、272、273、274、275、276、277、278、282、283、296、297</p></blockquote><h3 id="35-讨论深度学习的发展对推动机器学习的意义">35、讨论深度学习的发展对推动机器学习的意义。</h3><p><strong>答案：</strong></p><p>深度学习需要大量的标记数据并需要大量的计算能力，因此深度学习可以较好地应对机器学习中大规模数据集，为机器学习提供了解决复杂问题的方法。</p><hr><h3 id="251-神经网络的强大之处在于">251、神经网络的强大之处在于（ ）。</h3><ul><li><p>A、 复杂的结果</p></li><li><p>B、 并行处理能力</p></li><li><p>C、 串行处理能力</p></li><li><p>D、 神经元的功能</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="255-sigmoid函数的输出范围是">255、Sigmoid函数的输出范围是（ ）。</h3><ul><li><p>A、 [0,1]</p></li><li><p>B、 (0,1]</p></li><li><p>C、 [0,1)</p></li><li><p>D、 (0,1)</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="257-使用提前终止的方法可以防止过拟合现象的发生">257、使用提前终止的方法可以防止过拟合现象的发生。</h3><p><strong>答案： 正确</strong></p><hr><h3 id="259-以下关于神经网络的描述正确的说法是">259、以下关于神经网络的描述正确的说法是( )。</h3><ul><li><p>A、 神经网络对训练数据中的噪声不敏感,因此数据质量可以差一些也没关系</p></li><li><p>B、 不能确定输入属性的重要性</p></li><li><p>C、 训练神经网络是一个很耗时的过程</p></li><li><p>D、 只能用于分类</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="260-神经网络由许多神经元-neuron-组成-下列关于神经元的陈述中哪一个是正确的">260、神经网络由许多神经元(Neuron)组成,下列关于神经元的陈述中哪一个是正确的( )。</h3><ul><li><p>A、 一个神经元可以有多个输入和一个输出</p></li><li><p>B、 一个神经元可以有一个输入和多个输出</p></li><li><p>C、 一个神经元可以有多个输入和多个输出</p></li><li><p>D、 上述都正确</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="261-有关前馈神经网络的认识正确的是">261、有关前馈神经网络的认识正确的是( )。</h3><ul><li><p>A、 神经网络训练过程是拟合训练数据模式的过程</p></li><li><p>B、 神经网络训练后很容易得到分类的规则</p></li><li><p>C、 神经网络可用于分类和聚类</p></li><li><p>D、 神经网络模型的分类能力比决策树好</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="262-下面关于感知机的说法中正确的是">262、下面关于感知机的说法中正确的是( )。</h3><ul><li><p>A、 某一神经元可以连接下一层的多个神经元,表示该神经元有多个输出</p></li><li><p>B、 单个感知机是线性回归的训练过程</p></li><li><p>C、 在感知机中引入激活函数可以解决与异或问题(XOR)</p></li><li><p>D、 以上都不对</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="263-通过增加样本数可以减少过拟合的发生-常用的方法有以下几种">263、通过增加样本数可以减少过拟合的发生,常用的方法有以下几种( )。</h3><ul><li><p>A、 从数据源采集更多的数据</p></li><li><p>B、 复制原有数据并添加随机噪声</p></li><li><p>C、 重(复)采样</p></li><li><p>D、 根据现有样本估计样本的分布,然后按照此分布再产生一些样本</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="264-在一个神经网络里-确定每一个神经元的权重和偏差是模型拟合训练样本的目标-比较有效的办法是什么">264、在一个神经网络里,确定每一个神经元的权重和偏差是模型拟合训练样本的目标,比较有效的办法是什么( )。</h3><ul><li><p>A、 根据人工经验随机赋值</p></li><li><p>B、 搜索所有权重和偏差的组合,直到得到最佳值</p></li><li><p>C、 赋予一个初始值,然后迭代更新权重,直至代价函数取得极小</p></li><li><p>D、 以上都不正确</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="265-下列哪些方法可以用来降低深度学习模型的过拟合问题">265、下列哪些方法可以用来降低深度学习模型的过拟合问题( )。</h3><ul><li><p>A、 增加更多的数据</p></li><li><p>B、 提前停止训练</p></li><li><p>C、 Dropout</p></li><li><p>D、 正则化代价函数</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="271-以下关于感知机说法正确的是">271、以下关于感知机说法正确的是( )。</h3><ul><li><p>A、 在批量学习模式下,权重调整出现在学习每个样本之后</p></li><li><p>B、 只要参数设置得当,感知机理论上可以解决各种分类问题</p></li><li><p>C、 感知机的训练过程可以看成是在误差空间进行梯度下降</p></li><li><p>D、 感知机的激励函数必须采用门限函数</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="272-以下关于感知机说法正确的是">272、以下关于感知机说法正确的是( )。</h3><ul><li><p>A、 多层感知机比感知机只多了一个隐含层</p></li><li><p>B、 感知机只能形成线性判决平面,无法解决异或问题</p></li><li><p>C、 多层感知机可以有多个隐含层,但是只能有一个输出单元</p></li><li><p>D、 隐含层神经元的个数应当小于输入层神经元的个数</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="273-多层感知机解决线性不可分问题的原理是">273、多层感知机解决线性不可分问题的原理是( )。</h3><ul><li><p>A、 分而治之,对原始问题空间进行划分</p></li><li><p>B、 将原始问题向更高维空间映射</p></li><li><p>C、 在输出层和隐含层之间形成非线性的分界面</p></li><li><p>D、 将原始问题在隐含层映射成线性可分问题</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="274-采用sigmod函数作为激励函数的主要原因是">274、采用Sigmod函数作为激励函数的主要原因是( )。</h3><ul><li><p>A、 有固定的输出上下界</p></li><li><p>B、 计算复杂度较低</p></li><li><p>C、 导数存在解析解</p></li><li><p>D、 处处可导</p></li></ul><p><strong>答案： ACD</strong></p><hr><h3 id="275-在误差逆传播算法中-输出层神经元权重的调整机制和感知机的学习规则相比">275、在误差逆传播算法中,输出层神经元权重的调整机制和感知机的学习规则相比( )。</h3><ul><li><p>A、 考虑到线性不可分问题,学习规则更为复杂</p></li><li><p>B、 一模一样,等价于多个感知机</p></li><li><p>C、 遵循相同的原理,激励函数可能有所不同</p></li><li><p>D、 所有输出层神经元的权重需要同步调整</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="276-在误差逆传播算法中-隐含层节点的误差信息应当">276、在误差逆传播算法中,隐含层节点的误差信息应当( )。</h3><ul><li><p>A、 根据自身的期望输出和实际输出的差值计算</p></li><li><p>B、 根据所有输出层神经元的误差的均值计算</p></li><li><p>C、 根据自身下游神经元的误差进行加权计算</p></li><li><p>D、 根据自身下游神经元的误差的均值计算</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="277-为了克服学习空间中存在的局部最优点应当">277、为了克服学习空间中存在的局部最优点应当( )。</h3><ul><li><p>A、 尝试从不同的初始点开始训练</p></li><li><p>B、 将权重初始化为接近于0的值</p></li><li><p>C、 采用较小的学习率</p></li><li><p>D、 增加隐含层神经元个数</p></li></ul><p><strong>答案： A</strong></p><hr><h3 id="278-关于学习率参数的设置-正确的描述是">278、关于学习率参数的设置,正确的描述是( )。</h3><ul><li><p>A、 较大的值有助于提高算法的收敛稳定性</p></li><li><p>B、 较小的值有助于提高算法的收敛速度</p></li><li><p>C、 在开始阶段应该较大,然后逐渐减小</p></li><li><p>D、 在开始阶段应该较小,然后逐渐增大</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="282-前馈神经网络适用的场景为">282、前馈神经网络适用的场景为( )。</h3><ul><li><p>A、 训练时间有限</p></li><li><p>B、 需要较快的测试响应速度</p></li><li><p>C、 较好的可解释性</p></li><li><p>D、 多分类问题</p></li></ul><p><strong>答案： BD</strong></p><hr><h3 id="283-梯度下降算法的正确步骤是什么-1-计算预测值和真实值之间的误差-2-迭代更新-直到找到最佳权重-3把输入传入网络-得到输出值-4-初始化随机权重和偏差-5-对每一个产生误差的神经元-改变相应的-权重-值以减小误差">283、梯度下降算法的正确步骤是什么( )1.计算预测值和真实值之间的误差。2.迭代更新,直到找到最佳权重。3把输入传入网络,得到输出值。4. 初始化随机权重和偏差。5.对每一个产生误差的神经元,改变相应的(权重)值以减小误差</h3><ul><li><p>A、 12345</p></li><li><p>B、 54321</p></li><li><p>C、 32154</p></li><li><p>D、 43152</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="296-与决策树比较-神经网络适合处理什么类型的数据和问题">296、与决策树比较，神经网络适合处理什么类型的数据和问题。</h3><p><strong>答案：</strong></p><p>在中小数据集上，优先选择集成树模型。</p><p>大数据集上推荐神经网络；在需要模型解释度的项目上，优先使用树模型；</p><p>在项目时间较短的项目上，如果数据质量低 (大量缺失值、噪音等)，优先使用集成树模型；</p><p>在硬件条件有限及机器学习知识有限的前提下，优先选择树模型；</p><p>对于结构化较高的数据，尤其是语音、图片、语言，优先使用神经网络模型（往往其数据量也较大）。</p><hr><h3 id="297-什么是梯度消失？如何加快梯度下降的速度？">297、什么是梯度消失？如何加快梯度下降的速度？</h3><p><strong>答案：</strong></p><p>因为通常神经网络所用的激活函数是sigmoid函数，这个函数有个特点，就是能将负无穷到正无穷的数映射到0和1之间，并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘，得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘，因此当神经网络层数非常深的时候，最后一层产生的偏差就因为乘了很多的小于1的数而越来越小，最终就会变为0，从而导致层数比较浅的权重没有更新，这就是梯度消失。</p><p>可以使用mini-batch、Stochastic gradient descent等方法。mini-batch是将训练集分组，分组之后，分别对每组求梯度，然后更新参数。加入分 8组，则每次迭代将会做8次梯度下降，更新8次参数。所以mini-batch比传统的梯度下降法下降的速度快。Stochastic gradient descent可以看做是mini-batch的一种特殊情况，当mini-batch size等于1时，mini-batch就退化为Stochastic gradient descent。此时每次迭代中，对于数据集中每个样本都做一次梯度下降。还可以使用Monmentum、RMSprop、Adam等方法。</p><hr><h2 id="十-文本特征-图像分割与nlp拓展题">十、文本特征、图像分割与NLP拓展题</h2><blockquote><p>匹配范围：图片中出现“图像特征提取、序列数据模型”等拓展表述，题库中较接近的是文本特征、情感分析、图像分割等题。</p></blockquote><blockquote><p>本节题库原题号：159、188、189、190、191、195、196、197、198</p></blockquote><h3 id="159-在基于聚类的图像分割例子中">159、在基于聚类的图像分割例子中( )。</h3><ul><li><p>A、 色彩越复杂的图,需要的簇的个数越少</p></li><li><p>B、 属于同一个物体的像素对应同一个簇</p></li><li><p>C、 簇的个数越少,分割后图像越接近原始图像</p></li><li><p>D、 簇的个数越多,分割后图像越接近原始图像</p></li></ul><p><strong>答案： D</strong></p><hr><h3 id="188-高斯函数的个数和峰值个数是一致的-有几个高斯函数就有几个峰值">188、高斯函数的个数和峰值个数是一致的，有几个高斯函数就有几个峰值。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="189-tf-idf是用来评估文本中一个词对语料库中一篇文章重要程度的衡量标准-一个词在一篇文章中出现的频率越高-并且在语料库中其他文章中出现的次数越多-说明这个词越重要">189、TF-IDF是用来评估文本中一个词对语料库中一篇文章重要程度的衡量标准，一个词在一篇文章中出现的频率越高，并且在语料库中其他文章中出现的次数越多，说明这个词越重要。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="190-下列关于文本特征提取评价标准的描述不正确的是">190、下列关于文本特征提取评价标准的描述不正确的是（ ）。</h3><ul><li><p>A、 信息增益的值越大，说明这个属性越好</p></li><li><p>B、 IDF的值越大，说明这个词越能够代表整篇文章的意思</p></li><li><p>C、 互信息统计两个词同时出现的概率，两个变量单独出现的概率一样的话，联合概率越大说明关联度越小</p></li><li><p>D、 卡方用来检验两个事件的对立性，卡方值越大，说明特征词和类别的相关性越大</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="191-下列不能做词嵌入的方法是">191、下列不能做词嵌入的方法是（ ）。</h3><ul><li><p>A、 One-hot</p></li><li><p>B、 TF-IDF</p></li><li><p>C、 Word2Vec</p></li><li><p>D、 GloVe</p></li></ul><p><strong>答案： B</strong></p><hr><h3 id="195-常见的文本特征提取方法包括">195、常见的文本特征提取方法包括（ ）。</h3><ul><li><p>A、 LSI</p></li><li><p>B、 TF-IDF</p></li><li><p>C、 词嵌入</p></li><li><p>D、 向量空间模型</p></li></ul><p><strong>答案： ABCD</strong></p><hr><h3 id="196-信息熵的值域是-0-1-值越大表示确定性越大">196、信息熵的值域是[0,1]，值越大表示确定性越大。</h3><p><strong>答案： 错误</strong></p><hr><h3 id="197-下列关于情感分析的说明正确的是">197、下列关于情感分析的说明正确的是（ ）。</h3><ul><li><p>A、 常用神经网络来判断情感</p></li><li><p>B、 “他是一个乐于助人的小朋友”，这句话的情感是是负向的</p></li><li><p>C、 情感分析属于分类问题</p></li><li><p>D、 “明天可能会下雪”这句话的情感是正向的</p></li></ul><p><strong>答案： C</strong></p><hr><h3 id="198-有关文本特征的理解-错误的说法是哪个">198、有关文本特征的理解,错误的说法是哪个( )。</h3><ul><li><p>A、 文本不方便直接处理,需要提取表征内容的特征数值化</p></li><li><p>B、 TF-IDF和互信息都是文本特征提取的方法</p></li><li><p>C、 one-hot可以表示一个词的重要性</p></li><li><p>D、 信息增益是文本特征提取的方法</p></li></ul><p><strong>答案： C</strong></p><hr><h2 id="十一-图片范围新增补充题与可背答案">十一、图片范围新增补充题与可背答案</h2><p>以下题目主要来自新增手机图片范围，或用于补足题库中没有直接原题的考点。它们不是题库原题，但更贴近老师口头范围和图片中的考点。</p><h3 id="补充1-应用场景属于哪类机器学习任务">补充1 应用场景属于哪类机器学习任务</h3><p>**题目：**判断下列场景属于哪类任务：房价预测、肿瘤良恶性识别、信用卡欺诈识别、根据身高体重预测体脂率、客户分群。</p><p>**答案：**房价预测、体脂率预测属于回归；肿瘤良恶性识别、信用卡欺诈识别属于二分类；客户分群属于无监督聚类；如果肿瘤分成多种病理类型，则属于多分类。</p><p>**解析：**关键看输出结果。如果输出连续数值，是回归；如果输出两个类别，是二分类；如果输出多个类别，是多分类；如果没有标签，只是按相似性分组，是聚类。</p><hr><h3 id="补充2-knn算法怎样评价效果-影响效果的因素有哪些">补充2 KNN算法怎样评价效果，影响效果的因素有哪些</h3><p>**题目：**简述KNN算法的效果评价方法和主要影响因素。</p><p>**答案：**分类KNN通常用Accuracy、Precision、Recall、F1、混淆矩阵等评价；回归KNN常用MAE、MSE、RMSE、R2等评价。影响因素包括K值、距离度量、特征标准化、样本分布、类别不平衡、噪声和异常值、是否采用距离加权投票。</p><p>**解析：**KNN直接依赖样本间距离。特征量纲不同会导致距离被大尺度特征主导，K太小容易受噪声影响，K太大可能把局部结构抹平。</p><hr><h3 id="补充3-pca可以用哪些指标衡量-pca对数据是否有损失">补充3 PCA可以用哪些指标衡量，PCA对数据是否有损失</h3><p>**题目：**PCA降维效果可以用哪些指标衡量？PCA对数据是否一定有损失？</p><p>**答案：**常用指标包括各主成分方差贡献率、累计方差贡献率、保留维度数量、重构误差、可视化分离效果、下游模型效果变化。PCA如果只是坐标旋转且保留全部主成分，理论上信息不损失；如果降到更低维，通常会丢失部分信息。考试中问“PCA降维是否有损失”时，通常答：降维会有信息损失，但可通过保留较高累计方差贡献率来控制损失。</p><p>**解析：**PCA保留方差最大的方向，丢弃方差较小方向。方差贡献率越高，说明保留下来的信息越多，但方差小不一定等于对任务完全无用。</p><hr><h3 id="补充4-支持向量机常见判断口径">补充4 支持向量机常见判断口径</h3><p>**题目：**判断：支持向量机只能处理线性可分数据。</p><p>**答案：**错误。线性SVM用于线性可分或近似线性可分问题；软间隔可以处理不完全线性可分；核函数可以把数据隐式映射到高维空间处理非线性问题。</p><p>**解析：**SVM的核心不是“只能画直线”，而是在特征空间中寻找最大间隔超平面。核函数让非线性边界成为可能。</p><hr><h3 id="补充5-余弦相似度计算与判断">补充5 余弦相似度计算与判断</h3><p>**题目：**已知向量A=(1,2)，B=(2,4)，判断两者余弦相似度是否接近1，并说明含义。</p><p>**答案：**A和B方向完全相同，余弦相似度为1，表示方向上最相似。余弦相似度越接近1，两个向量越相似；越接近0，方向越不相关；越接近-1，方向越相反。</p><p>**解析：**余弦相似度关注夹角，不关注向量长度。文本向量、推荐系统中经常使用它衡量方向相似性。</p><hr><h3 id="补充6-混淆矩阵与precision-recall-accuracy">补充6 混淆矩阵与Precision、Recall、Accuracy</h3><p>**题目：**某二分类模型TP=80，FP=20，FN=10，TN=90，计算Precision、Recall、Accuracy。</p><p>**答案：**Precision=TP/(TP+FP)=80/(80+20)=0.80；Recall=TP/(TP+FN)=80/(80+10)=0.889；Accuracy=(TP+TN)/(TP+FP+FN+TN)=(80+90)/200=0.85。</p><p>**解析：**Precision看“预测为正的里面有多少真为正”；Recall看“真实为正的里面找回了多少”；Accuracy看整体预测正确比例。类别不平衡时，不能只看Accuracy。</p><hr><h3 id="补充7-模型准确率是否越高越好">补充7 模型准确率是否越高越好</h3><p>**题目：**判断：分类模型Accuracy越高，模型性能一定越好。</p><p>**答案：**错误。Accuracy高不一定代表模型整体性能更好，特别是在类别不平衡、误判代价不同、需要关注少数类召回率的场景中。</p><p>**解析：**例如欺诈检测中，欺诈样本很少，模型全部预测为正常也可能有很高Accuracy，但Recall很差，实际价值很低。</p><hr><h3 id="补充8-梯度下降有哪些类型-是否都能找到全局最优">补充8 梯度下降有哪些类型，是否都能找到全局最优</h3><p>**题目：**简述梯度下降的常见类型，并判断梯度下降是否总能找到全局最优。</p><p>**答案：**常见类型有批量梯度下降BGD、随机梯度下降SGD、小批量梯度下降Mini-batch GD。对凸优化问题，在合适学习率和条件下可收敛到全局最优或接近全局最优；对神经网络等非凸问题，不保证找到全局最优，可能停在局部最优、鞍点或较好的近似解。</p><p>**解析：**梯度下降只是沿负梯度方向迭代的优化方法，能否全局最优取决于损失函数形状、学习率、初始化和数据。</p><hr><h3 id="补充9-batch-size大小对深度学习训练的影响">补充9 Batch size大小对深度学习训练的影响</h3><p>**题目：**深度学习训练时batch size大小会带来什么影响？</p><p>**答案：**batch size小，参数更新更频繁，梯度噪声更大，显存占用小，可能有更好的泛化但训练不够稳定；batch size大，梯度估计更稳定，硬件并行效率更高，但显存占用大，可能需要调整学习率，过大时泛化可能变差。</p><p>**解析：**batch size不是越大越好，也不是越小越好，要结合显存、数据规模、学习率和收敛情况调整。</p><hr><h3 id="补充10-决策树和集成学习是否需要标准化">补充10 决策树和集成学习是否需要标准化</h3><p>**题目：**判断：所有机器学习模型都必须先做标准化。</p><p>**答案：**错误。KNN、SVM、逻辑回归、神经网络等通常需要标准化；决策树、随机森林、GBDT等树模型一般不强制需要标准化。集成学习是否需要标准化取决于基学习器。</p><p>**解析：**依赖距离、内积或梯度优化的模型对尺度敏感；树模型主要根据阈值切分特征，对单调尺度变换相对不敏感。</p><hr><h3 id="补充11-欠拟合与过拟合定义和解决方法">补充11 欠拟合与过拟合定义和解决方法</h3><p>**题目：**解释欠拟合和过拟合的定义，并说明解决方法。</p><p>**答案：**欠拟合是模型过于简单，训练集和测试集效果都差。解决方法包括增加模型复杂度、增加特征、减少过强正则化、训练更久。过拟合是模型把训练集噪声也学进去，训练集效果好但测试集效果差。解决方法包括增加数据、数据增强、正则化、剪枝、Dropout、早停、降低模型复杂度、交叉验证。</p><p>**解析：**判断二者要同时看训练集和测试集。只看一个指标容易误判。</p><hr><h3 id="补充12-特征工程过程-应用和优缺点">补充12 特征工程过程、应用和优缺点</h3><p>**题目：**简述特征工程的主要过程、应用和优缺点。</p><p>**答案：**过程包括数据清洗、缺失值处理、异常值处理、编码、标准化/归一化、特征构造、特征选择、特征提取、降维。应用于分类、回归、聚类、推荐、文本分析等任务。优点是能提升模型效果、降低噪声、增强可解释性；缺点是依赖业务经验，容易引入偏差，处理不当会造成信息泄漏或损失。</p><p>**解析：**特征工程不是单一步骤，而是把原始数据转化成模型可有效学习的数据表示。</p><hr><h3 id="补充13-深度学习与传统机器学习对比">补充13 深度学习与传统机器学习对比</h3><p>**题目：**比较深度学习和传统机器学习的优缺点。</p><p>**答案：**传统机器学习通常依赖人工特征工程，适合中小规模结构化数据，可解释性较好，训练成本较低；深度学习能自动学习复杂特征，适合图像、语音、文本等非结构化大数据，但需要大量数据和算力，可解释性较弱，调参成本较高。</p><p>**解析：**选择哪种方法不是看名字高级，而是看数据规模、数据类型、任务复杂度、算力、解释性要求和项目时间。</p><hr><h3 id="补充14-数据预处理对机器学习的影响">补充14 数据预处理对机器学习的影响</h3><p>**题目：**说明数据预处理对机器学习有什么影响。</p><p>**答案：**数据预处理会影响模型训练稳定性、收敛速度、泛化能力和最终评价指标。缺失值、异常值、重复数据、噪声、量纲差异、类别不平衡都会干扰模型学习。好的预处理可以提升有效信息质量，错误预处理可能造成信息泄漏、样本偏差或重要信息损失。</p><p>**解析：**对考试来说，要强调“不是所有数据都直接删除”，而是根据问题选择填补、修正、变换、保留或剔除。</p><hr><h3 id="补充15-机器学习算法选择依据">补充15 机器学习算法选择依据</h3><p>**题目：**选择机器学习算法时应考虑哪些依据？</p><p>**答案：**应考虑任务类型、数据规模、特征维度、线性或非线性关系、类别是否平衡、噪声和异常值、是否需要解释性、训练和预测速度、可用算力、评价指标和业务代价。例如小规模高维分类可考虑SVM，结构化表格分类可考虑树模型或随机森林，图像语音文本等非结构化大数据可考虑深度学习。</p><p>**解析：**不存在一种算法适合所有问题，算法选择需要实验比较和交叉验证。</p><hr><h3 id="补充16-大数据对机器学习和深度学习的影响">补充16 大数据对机器学习和深度学习的影响</h3><p>**题目：**大数据对机器学习和深度学习带来了什么影响？</p><p>**答案：**积极影响包括提供更多训练样本、提升模型泛化能力、支持复杂模型学习、促进深度学习发展。挑战包括存储和计算成本增加、数据质量参差不齐、隐私安全风险、类别不平衡、噪声和偏差被放大、模型训练和部署成本上升。</p><p>**解析：**大数据不是数据越多越好，关键还要看数据质量、标注质量、代表性和计算资源。</p><hr><h3 id="补充17-scikit-learn线性回归编程题">补充17 Scikit-learn线性回归编程题</h3><p>**题目：**使用 Scikit-learn 完成线性回归。要求：1. 导入库；2. 创建训练数据和测试数据；3. 创建并训练模型；4. 对测试数据预测并输出结果。</p><p><strong>参考代码：</strong></p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> LinearRegression</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">X_train = np.array([[<span class="number">1</span>], [<span class="number">2</span>], [<span class="number">3</span>], [<span class="number">4</span>]])</span><br><span class="line">y_train = np.array([<span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>])</span><br><span class="line">X_test = np.array([[<span class="number">5</span>], [<span class="number">6</span>]])</span><br><span class="line"></span><br><span class="line">model = LinearRegression()</span><br><span class="line">model.fit(X_train, y_train)</span><br><span class="line">y_pred = model.predict(X_test)</span><br><span class="line"><span class="built_in">print</span>(y_pred)</span><br></pre></td></tr></table></figure><p>**解析：**LinearRegression用于创建线性回归模型，fit用于训练，predict用于预测。该示例中模型会学习接近y=2x的关系。</p><hr><h3 id="补充18-机器学习应用前景和面临挑战">补充18 机器学习应用前景和面临挑战</h3><p>**题目：**讨论机器学习应用前景和面临的挑战。</p><p>**答案：**应用前景包括智能推荐、金融风控、医学诊断、工业质检、自动驾驶、自然语言处理、教育个性化和网络安全等。挑战包括高质量数据不足、模型可解释性弱、隐私和安全风险、偏见与公平性问题、部署成本高、模型漂移、过拟合和泛化能力不足。</p><p>**解析：**讨论题需要同时写价值和限制，不能只写应用广泛。</p><hr><h2 id="十二-考前高频判断口径速记">十二、考前高频判断口径速记</h2><ol><li>有标签训练一般是监督学习，无标签分组一般是无监督学习。</li><li>房价、销量、体重等连续数值预测一般是回归；是否患病、是否欺诈一般是二分类。</li><li>K-means需要预先给定K，对初始中心敏感，适合近似球形簇，不适合复杂不规则形状。</li><li>KNN依赖距离，通常需要标准化；K值太小易受噪声影响，K值太大容易欠拟合。</li><li>PCA降维通常有信息损失，常看方差贡献率和累计方差贡献率。</li><li>SVM不是只能处理线性问题，核函数可以处理非线性，软间隔处理不完全线性可分。</li><li>Accuracy不能单独代表模型好坏，类别不平衡时要看Precision、Recall、F1等。</li><li>过拟合表现为训练集好、测试集差；欠拟合表现为训练集和测试集都差。</li><li>决策树和随机森林一般不强制标准化；SVM、KNN、逻辑回归、神经网络通常需要标准化。</li><li>梯度下降在凸问题中更容易接近全局最优，在深度学习非凸问题中不保证全局最优。</li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1</summary>
        
      
    
    
    
    <category term="课程复习" scheme="https://college-github-io.pages.dev/categories/%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/"/>
    
    
    <category term="机器学习" scheme="https://college-github-io.pages.dev/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="题库" scheme="https://college-github-io.pages.dev/tags/%E9%A2%98%E5%BA%93/"/>
    
    <category term="复习范围" scheme="https://college-github-io.pages.dev/tags/%E5%A4%8D%E4%B9%A0%E8%8C%83%E5%9B%B4/"/>
    
  </entry>
  
  <entry>
    <title>机器学习期末复习资料：老师重点整理版</title>
    <link href="https://college-github-io.pages.dev/posts/ab02f705/"/>
    <id>https://college-github-io.pages.dev/posts/ab02f705/</id>
    <published>2026-06-10T04:59:12.000Z</published>
    <updated>2026-06-10T05:10:36.174Z</updated>
    
    <content type="html"><![CDATA[<h1 id="机器学习期末复习资料：老师重点整理版">机器学习期末复习资料：老师重点整理版</h1><h2 id="0-使用说明与重点来源">0. 使用说明与重点来源</h2><p>这份资料根据你拍摄的老师重点清单整理，并结合机器学习课程的常见考试方式进行补全。照片中有反光和遮挡，个别词我按课程常见写法修正：PACA 按 PCA 处理，AKSAISZ 按 batch size 处理，K算法按 KNN 和 K-means 分开整理。整体识别置信度为中，核心知识点置信度为高。</p><p>复习时不要只背定义，要能判断题目属于分类、回归、聚类、降维还是优化问题。考试中最容易丢分的地方不是概念本身，而是把 KNN 和 K-means 混淆，把逻辑回归当成普通回归，把 PCA 当成分类算法，把准确率当成唯一评价指标。</p><h2 id="1-机器学习总览">1. 机器学习总览</h2><p>机器学习是让计算机从数据中学习规律，再用学到的规律对未知样本进行预测、分类、聚类、降维或决策。传统程序通常是“人写规则，机器执行规则”；机器学习是“人提供数据和目标，机器从数据中学习规则”。</p><h3 id="1-1-机器学习基本流程">1.1 机器学习基本流程</h3><ol><li>明确任务目标：先判断是分类、回归、聚类、降维、推荐还是异常检测。</li><li>收集数据：数据可以来自数据库、传感器、日志、图片、文本、表格等。</li><li>数据预处理：处理缺失值、异常值、重复值和格式不一致问题。</li><li>特征工程：提取、构造、选择和变换特征。</li><li>划分数据集：通常划分训练集、验证集和测试集。</li><li>选择模型：根据任务和数据特点选择算法。</li><li>训练模型：用训练集拟合模型参数。</li><li>验证与调参：用验证集选择超参数，例如 K 值、树深度、学习率。</li><li>测试模型：用测试集评估泛化能力。</li><li>部署应用：将模型用于真实预测，同时持续监控效果。</li></ol><h3 id="1-2-机器学习分类">1.2 机器学习分类</h3><table><thead><tr><th>学习类型</th><th>是否需要标签</th><th>目标</th><th>常见算法</th><th>例子</th></tr></thead><tbody><tr><td>监督学习</td><td>需要标签</td><td>学习输入到输出的映射</td><td>线性回归、逻辑回归、KNN、SVM、决策树、随机森林、朴素贝叶斯</td><td>房价预测、肿瘤良恶性分类、信用卡欺诈识别</td></tr><tr><td>无监督学习</td><td>不需要标签</td><td>发现数据内部结构</td><td>K-means、层次聚类、PCA</td><td>客户分群、数据降维、异常发现</td></tr><tr><td>半监督学习</td><td>少量有标签，大量无标签</td><td>降低人工标注成本</td><td>半监督分类、伪标签方法</td><td>医学图像、网页分类</td></tr><tr><td>强化学习</td><td>通过奖励信号学习</td><td>学习最优行动策略</td><td>Q-learning、DQN</td><td>游戏智能体、机器人控制、自动驾驶</td></tr></tbody></table><h3 id="1-3-分类-回归-聚类-降维的区别">1.3 分类、回归、聚类、降维的区别</h3><p>分类预测的是离散类别，例如“是或否”“良性或恶性”“猫或狗”。回归预测的是连续数值，例如房价、温度、销售额、身高。聚类是在没有标签的情况下把相似样本分组，例如客户分群。降维是把高维特征压缩到低维空间，例如把几十个指标压缩成几个主成分。</p><p>判断题时可以抓关键词：出现“类别、是否、哪一类”通常是分类；出现“价格、分数、温度、数值”通常是回归；出现“分群、划分客户、相似样本聚在一起”通常是聚类；出现“减少维度、可视化、保留主要信息”通常是降维。</p><h2 id="2-数据预处理">2. 数据预处理</h2><p>数据预处理是在建模前把原始数据变得更干净、更统一、更适合模型学习。很多模型效果不好，不一定是算法差，而是数据中存在缺失、异常、尺度差异或类别编码问题。</p><h3 id="2-1-缺失值处理">2.1 缺失值处理</h3><p>常见处理方法包括删除缺失样本、均值填充、中位数填充、众数填充、插值填充和模型预测填充。</p><p>如果缺失比例很低，可以直接删除。若数值型特征分布比较平稳，可用均值填充；如果存在极端值，中位数比均值更稳健。类别型特征常用众数填充，也可以新增一个“未知”类别。</p><h3 id="2-2-异常值处理">2.2 异常值处理</h3><p>异常值是明显偏离正常范围的数据，例如年龄为 300、身高为 5 米、价格为负数。处理方式包括删除、截断、分箱、平滑或保留并标记。是否删除异常值要看业务含义，有些异常点可能是真实重要事件，例如欺诈交易。</p><h3 id="2-3-标准化与归一化">2.3 标准化与归一化</h3><p>标准化公式：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">x&#x27; = (x - μ) / σ</span><br></pre></td></tr></table></figure><p>其中 μ 是均值，σ 是标准差。标准化后数据通常均值接近 0，标准差接近 1。</p><p>归一化公式：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">x&#x27; = (x - xmin) / (xmax - xmin)</span><br></pre></td></tr></table></figure><p>归一化后数据被压缩到固定区间，常见为 [0, 1]。</p><table><thead><tr><th>方法</th><th>结果</th><th>适合情况</th><th>典型算法</th></tr></thead><tbody><tr><td>标准化</td><td>均值约为 0，标准差约为 1</td><td>数据近似正态或算法对尺度敏感</td><td>SVM、逻辑回归、线性回归、神经网络</td></tr><tr><td>归一化</td><td>数值压缩到固定区间</td><td>需要控制输入范围</td><td>KNN、K-means、神经网络</td></tr></tbody></table><p>KNN、K-means、SVM、逻辑回归、线性回归和神经网络通常需要标准化或归一化。决策树和随机森林通常不太需要，因为它们主要根据阈值划分数据，不依赖距离大小。</p><h3 id="2-4-类别特征编码">2.4 类别特征编码</h3><p>机器学习模型通常不能直接处理“男、女、北京、武汉”这类字符串，需要转成数值。常见方法包括标签编码和独热编码。</p><p>标签编码把类别映射为数字，例如男为 0，女为 1。独热编码把类别展开为多个 0/1 特征，例如城市有北京、上海、武汉三类，就变成三个特征。没有大小顺序的类别通常更适合独热编码，否则模型可能误以为数字大小代表类别强弱。</p><h2 id="3-特征工程">3. 特征工程</h2><p>特征工程是把原始数据转化为更适合模型学习的特征。它包括特征清洗、构造、选择、变换、编码和降维。</p><h3 id="3-1-特征工程过程">3.1 特征工程过程</h3><ol><li>理解任务目标和业务含义。</li><li>清洗数据，处理缺失值、异常值和重复值。</li><li>构造新特征，例如由出生日期得到年龄，由销售额和数量得到单价。</li><li>编码类别特征，例如独热编码。</li><li>特征缩放，例如标准化或归一化。</li><li>特征选择，删除无关特征和冗余特征。</li><li>特征降维，例如使用 PCA。</li><li>通过交叉验证检验特征是否真的提升效果。</li></ol><h3 id="3-2-特征工程应用">3.2 特征工程应用</h3><p>房价预测中，面积、楼层、房龄、地段是原始特征，可以进一步构造距离地铁距离、是否学区房、单位面积价格等特征。信用卡欺诈检测中，可以构造交易频率、异常时间交易、交易地点变化、单笔金额与历史均值的偏离程度。图像识别中，传统方法会提取边缘、纹理、颜色直方图，深度学习则通常由 CNN 自动学习图像特征。</p><h3 id="3-3-特征工程优缺点">3.3 特征工程优缺点</h3><p>优点是可以显著提升模型效果，减少噪声影响，提高泛化能力和可解释性。缺点是耗时、依赖经验，错误特征可能引入噪声，还可能造成过拟合。</p><p>考试回答时可以写：特征工程不是单纯“加特征”，而是围绕任务目标把原始信息转化为有效输入。好的特征可以让简单模型也获得较好效果，差的特征会让复杂模型也难以学习。</p><h2 id="4-监督学习重点">4. 监督学习重点</h2><p>监督学习使用带标签数据训练模型。输入样本通常记为 X，标签或目标值记为 y。监督学习主要分为分类和回归。</p><h3 id="4-1-线性回归">4.1 线性回归</h3><p>线性回归用于预测连续数值，其模型形式为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">y = w1*x1 + w2*x2 + ... + wn*xn + b</span><br></pre></td></tr></table></figure><p>其中 w 是权重，b 是偏置。线性回归通过最小化预测值和真实值之间的误差来学习参数，常用损失函数是均方误差 MSE。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">MSE = (1/m) * Σ(yi - ŷi)^2</span><br></pre></td></tr></table></figure><p>线性回归适合变量之间近似线性关系的场景，例如根据面积预测房价，根据广告投入预测销售额。它的优点是简单、速度快、可解释性强；缺点是表达能力有限，无法很好处理复杂非线性关系，并且对异常值比较敏感。</p><h3 id="4-2-逻辑回归">4.2 逻辑回归</h3><p>逻辑回归虽然名字中有“回归”，但主要用于分类，尤其是二分类。它先计算线性组合，再通过 Sigmoid 函数把结果压缩到 0 到 1 之间，表示属于正类的概率。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">σ(z) = 1 / (1 + e^(-z))</span><br></pre></td></tr></table></figure><p>如果输出概率大于阈值，例如 0.5，就判断为正类，否则判断为负类。逻辑回归常用于垃圾邮件识别、肿瘤良恶性判断、用户流失预测和信用风险评估。</p><p>需要注意：逻辑回归不是用来预测连续数值的普通回归模型。它输出的是类别概率，最终通常用于分类。</p><h3 id="4-3-knn-算法">4.3 KNN 算法</h3><p>KNN 全称 K-Nearest Neighbors，中文是 K 近邻算法。它的核心思想是：一个样本属于哪一类，可以参考它附近最近的 K 个样本，多数邻居属于哪一类，新样本就归为哪一类。</p><p>KNN 的步骤：</p><ol><li>选择 K 值。</li><li>计算待预测样本与所有训练样本之间的距离。</li><li>找到距离最近的 K 个样本。</li><li>分类任务采用多数投票。</li><li>回归任务采用 K 个邻居目标值的平均值。</li></ol><p>常用距离包括欧氏距离、曼哈顿距离和余弦距离。欧氏距离公式为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">d = sqrt((x1-y1)^2 + (x2-y2)^2 + ... + (xn-yn)^2)</span><br></pre></td></tr></table></figure><p>KNN 效果受以下因素影响：K 值大小、距离度量方式、数据是否标准化、特征是否有效、样本数量、噪声和异常值、类别是否均衡。</p><p>K 值过小，模型容易受噪声影响，容易过拟合。K 值过大，分类边界过于平滑，容易欠拟合。一般通过交叉验证选择较合适的 K 值。</p><p>KNN 优点是原理简单、容易实现、不需要复杂训练。缺点是预测时计算量大，对特征尺度敏感，对噪声敏感，高维数据下效果可能下降。</p><h3 id="4-4-支持向量机-svm">4.4 支持向量机 SVM</h3><p>SVM 全称 Support Vector Machine，中文是支持向量机。它是一种监督学习算法，常用于分类，也可以用于回归。</p><p>SVM 的核心思想是找到一个最优分类超平面，使不同类别之间的间隔最大。离分类边界最近的样本点叫支持向量，它们决定了分类边界的位置。</p><p>二维空间中的分类边界是一条直线，三维空间中是一个平面，更高维空间中称为超平面。</p><p>SVM 不是只能处理线性问题。对于非线性可分数据，SVM 可以使用核函数把数据映射到更高维空间，使其在高维空间中更容易被线性划分。常见核函数包括线性核、多项式核和 RBF 高斯核。</p><table><thead><tr><th>核函数</th><th>适用情况</th></tr></thead><tbody><tr><td>线性核</td><td>数据近似线性可分，特征维度较高</td></tr><tr><td>多项式核</td><td>数据存在多项式关系</td></tr><tr><td>RBF 高斯核</td><td>非线性边界复杂，实际应用中很常见</td></tr></tbody></table><p>SVM 的优点是适合小样本、高维数据，泛化能力较好。缺点是大数据训练较慢，核函数和参数选择比较困难，对噪声和异常值敏感。</p><h3 id="4-5-决策树">4.5 决策树</h3><p>决策树是一种树形结构模型，通过一系列条件判断完成分类或回归。它很像人类做选择的过程。例如判断是否购买电脑，可以依次根据年龄、收入、是否学生、信用等级做判断。</p><p>决策树常见划分指标包括信息增益、信息增益率和基尼指数。ID3 常用信息增益，C4.5 常用信息增益率，CART 常用基尼指数。</p><p>决策树通常不需要标准化，因为它根据特征阈值划分样本，不依赖距离计算。它可以处理非线性关系，可解释性强，但容易过拟合。常见解决方式包括限制树深度、设置最小样本数、剪枝和使用随机森林。</p><h3 id="4-6-随机森林">4.6 随机森林</h3><p>随机森林是集成学习方法，由多棵决策树组成。单棵决策树容易过拟合，而随机森林通过多个模型投票或平均，使结果更稳定。</p><p>随机森林构建过程：</p><ol><li>从原始训练集中进行有放回抽样，得到多个训练子集。</li><li>每个训练子集训练一棵决策树。</li><li>每棵树在节点划分时随机选择部分特征参与划分。</li><li>多棵树分别预测。</li><li>分类任务采用多数投票，回归任务采用平均值。</li></ol><p>随机森林的优点是泛化能力强、不容易过拟合、可以处理高维数据、可以评估特征重要性。缺点是模型较大，训练和预测成本比单棵树高，可解释性下降。</p><h3 id="4-7-朴素贝叶斯">4.7 朴素贝叶斯</h3><p>朴素贝叶斯是一种基于贝叶斯定理的分类算法。贝叶斯公式为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">P(A|B) = P(B|A)P(A) / P(B)</span><br></pre></td></tr></table></figure><p>“朴素”是指它假设各特征在类别给定的条件下相互独立。这个假设在现实中不一定完全成立，但在文本分类、垃圾邮件识别等任务中效果常常不错。</p><p>朴素贝叶斯优点是训练速度快、实现简单、适合文本分类和小规模数据。缺点是特征独立假设较强，如果特征之间相关性很强，效果可能下降。</p><h2 id="5-无监督学习重点">5. 无监督学习重点</h2><p>无监督学习没有标签，模型需要自己发现数据内部结构。老师重点中出现了 K-means、PCA、聚类和降维，这些都是无监督学习高频考点。</p><h3 id="5-1-k-means-聚类">5.1 K-means 聚类</h3><p>K-means 是常见聚类算法。它的目标是把数据分成 K 个簇，使同一簇内样本尽量相似，不同簇之间尽量不同。</p><p>K-means 步骤：</p><ol><li>预先指定聚类数量 K。</li><li>随机选择 K 个初始聚类中心。</li><li>计算每个样本到各中心点的距离。</li><li>把样本分配给最近的中心点。</li><li>更新每个簇的中心点。</li><li>重复分配和更新，直到中心点基本不变或达到最大迭代次数。</li></ol><p>K-means 的优点是简单、速度快、适合大规模数据。缺点是需要提前指定 K，对初始中心敏感，对异常值敏感，不适合非球形簇，并且通常需要标准化数据。</p><h3 id="5-2-k-means">5.2 K-means++</h3><p>K-means++ 是对 K-means 初始中心选择方式的改进。普通 K-means 随机选中心，可能导致初始中心太接近，从而影响聚类效果。K-means++ 倾向于选择彼此距离更远的初始中心，使聚类更稳定。</p><p>考试中如果问 K-means++ 的作用，可以回答：它主要改进 K-means 初始聚类中心的选择，减少随机初始化带来的不稳定，提高收敛效果和聚类质量。</p><h3 id="5-3-聚类算法举例">5.3 聚类算法举例</h3><p>常见聚类算法包括 K-means、层次聚类、DBSCAN 和高斯混合模型。</p><table><thead><tr><th>算法</th><th>思想</th><th>适用场景</th><th>局限</th></tr></thead><tbody><tr><td>K-means</td><td>根据距离把样本分到 K 个中心附近</td><td>大规模、簇形状接近球形的数据</td><td>需指定 K，对异常值敏感</td></tr><tr><td>层次聚类</td><td>按样本相似度逐层合并或划分</td><td>小规模数据、需要树状结构解释</td><td>大数据效率低</td></tr><tr><td>DBSCAN</td><td>根据密度寻找簇</td><td>发现任意形状簇、识别噪声</td><td>参数 eps 和 min_samples 难选</td></tr><tr><td>高斯混合模型</td><td>假设数据由多个高斯分布混合</td><td>概率聚类、软分类</td><td>对分布假设敏感</td></tr></tbody></table><h3 id="5-4-pca-主成分分析">5.4 PCA 主成分分析</h3><p>PCA 是 Principal Component Analysis，中文是主成分分析。它是一种无监督降维方法，目的是在尽量保留原始数据信息的前提下，把高维特征压缩成低维主成分。</p><p>PCA 的核心思想是找到数据中方差最大的方向。第一主成分保留最多变化信息，第二主成分在与第一主成分正交的方向上保留次多变化信息，以此类推。</p><p>PCA 可以衡量的信息包括：方差贡献率、累计方差贡献率、主成分数量、信息保留程度和重构误差。</p><p>PCA 是否会损失数据？答案是会。因为降维会舍弃一部分方差较小的方向，所以一定可能损失信息。保留主成分越多，信息损失越小；保留主成分越少，压缩更强，但信息损失更大。</p><p>PCA 优点是降低维度、减少冗余、缓解维度灾难、提高训练速度、方便可视化。缺点是主成分不容易解释，只适合线性降维，对标准化敏感，并且可能丢失有用信息。</p><h2 id="6-模型训练-验证与评价">6. 模型训练、验证与评价</h2><p>机器学习不只是训练模型，还要判断模型是否真的能在新数据上表现好。训练集效果好不等于模型好，关键是泛化能力。</p><h3 id="6-1-训练集-验证集-测试集">6.1 训练集、验证集、测试集</h3><p>训练集用于学习模型参数。验证集用于选择超参数和模型，例如 K 值、学习率、树深度。测试集用于最终评估模型泛化能力，理论上不应参与调参。</p><p>如果数据较少，可以使用交叉验证，让数据被更充分利用。</p><h3 id="6-2-交叉验证">6.2 交叉验证</h3><p>交叉验证用于更稳定地评估模型效果，减少一次随机划分数据带来的偶然性。常见方法是 K 折交叉验证。</p><p>以 5 折交叉验证为例：把数据分为 5 份，每次用 4 份训练，1 份验证，重复 5 次，最后取平均指标作为模型效果。</p><p>交叉验证常用于模型选择和超参数调优，不是为了单纯提高训练集准确率。</p><h3 id="6-3-分类评价指标">6.3 分类评价指标</h3><table><thead><tr><th>指标</th><th>含义</th><th>适用情况</th></tr></thead><tbody><tr><td>Accuracy 准确率</td><td>总体预测正确的比例</td><td>类别比较均衡时</td></tr><tr><td>Precision 精确率</td><td>预测为正的样本中真正为正的比例</td><td>误报代价高时</td></tr><tr><td>Recall 召回率</td><td>真实为正的样本中被找出来的比例</td><td>漏报代价高时</td></tr><tr><td>F1-score</td><td>精确率和召回率的综合</td><td>类别不平衡时</td></tr><tr><td>AUC</td><td>衡量模型区分正负样本的能力</td><td>二分类排序评价</td></tr><tr><td>混淆矩阵</td><td>展示 TP、FP、TN、FN</td><td>分析错误类型</td></tr></tbody></table><p>准确率高不一定代表模型好。比如 1000 个样本中只有 10 个患病，模型全部预测为健康，准确率仍然可以达到 99%，但它完全没有识别出患病样本。</p><h3 id="6-4-回归评价指标">6.4 回归评价指标</h3><table><thead><tr><th>指标</th><th>含义</th><th>趋势</th></tr></thead><tbody><tr><td>MSE</td><td>均方误差</td><td>越小越好</td></tr><tr><td>RMSE</td><td>均方根误差</td><td>越小越好</td></tr><tr><td>MAE</td><td>平均绝对误差</td><td>越小越好</td></tr><tr><td>R²</td><td>拟合优度</td><td>越接近 1 越好</td></tr></tbody></table><p>MSE 对大误差更敏感，MAE 更直观，R² 表示模型解释数据变化的能力。</p><h3 id="6-5-聚类评价指标">6.5 聚类评价指标</h3><p>聚类没有真实标签时，常用轮廓系数、SSE、Calinski-Harabasz 指数和 Davies-Bouldin 指数。轮廓系数越接近 1，说明簇内越紧密、簇间越分离。SSE 是簇内误差平方和，常配合肘部法选择 K 值。</p><h2 id="7-过拟合-欠拟合与正则化">7. 过拟合、欠拟合与正则化</h2><h3 id="7-1-欠拟合">7.1 欠拟合</h3><p>欠拟合是模型太简单，不能充分学习数据规律。表现为训练集效果差，测试集效果也差。</p><p>常见原因：模型过于简单，特征太少，训练不充分，正则化太强。</p><p>解决方法：增加模型复杂度，增加有效特征，减少正则化强度，延长训练时间，换用表达能力更强的模型。</p><h3 id="7-2-过拟合">7.2 过拟合</h3><p>过拟合是模型把训练数据中的噪声和细节也学进去了。表现为训练集效果很好，测试集效果明显变差。</p><p>常见原因：模型过于复杂，样本太少，特征太多，噪声较多，训练时间过长。</p><p>解决方法：增加数据，数据增强，降低模型复杂度，特征选择，正则化，交叉验证，早停，Dropout，决策树剪枝。</p><h3 id="7-3-正则化">7.3 正则化</h3><p>正则化是在损失函数中加入惩罚项，限制模型参数过大，从而降低模型复杂度，缓解过拟合。</p><p>L1 正则化：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">Loss = 原损失 + λ * Σ|wi|</span><br></pre></td></tr></table></figure><p>L1 正则化可以让部分参数变成 0，有特征选择作用。</p><p>L2 正则化：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">Loss = 原损失 + λ * Σwi^2</span><br></pre></td></tr></table></figure><p>L2 正则化会让参数变小，使模型更平滑、更稳定，但一般不会直接让参数变成 0。</p><p>注意：正则化不是越强越好。正则化太弱可能过拟合，太强可能欠拟合。</p><h2 id="8-梯度下降与深度学习训练">8. 梯度下降与深度学习训练</h2><h3 id="8-1-梯度下降基本思想">8.1 梯度下降基本思想</h3><p>梯度下降是一种优化算法，用来最小化损失函数。它沿着损失函数下降最快的方向更新参数，使损失逐渐变小。</p><p>参数更新形式为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">w = w - α * ∂J(w)/∂w</span><br></pre></td></tr></table></figure><p>其中 α 是学习率，J(w) 是损失函数。</p><h3 id="8-2-梯度下降类型">8.2 梯度下降类型</h3><table><thead><tr><th>类型</th><th>每次使用的数据</th><th>优点</th><th>缺点</th></tr></thead><tbody><tr><td>批量梯度下降 BGD</td><td>全部样本</td><td>稳定</td><td>速度慢，占内存</td></tr><tr><td>随机梯度下降 SGD</td><td>一个样本</td><td>更新快</td><td>波动大</td></tr><tr><td>小批量梯度下降 Mini-batch GD</td><td>一小批样本</td><td>效率和稳定性较平衡</td><td>batch size 需要选择</td></tr><tr><td>Momentum</td><td>加入动量</td><td>减少震荡，加快收敛</td><td>多一个参数</td></tr><tr><td>Adam</td><td>自适应学习率</td><td>深度学习中常用</td><td>需要调学习率等参数</td></tr></tbody></table><h3 id="8-3-梯度下降能否找到全局最优">8.3 梯度下降能否找到全局最优</h3><p>不一定。在线性回归这类凸优化问题中，如果学习率合适，梯度下降可以收敛到全局最优。但在神经网络这类非凸问题中，损失函数很复杂，梯度下降可能陷入局部最优、鞍点或震荡。</p><p>学习率太大可能越过最低点甚至发散，学习率太小训练会很慢。</p><h3 id="8-4-batch-size">8.4 batch size</h3><p>batch size 是每次训练送入模型的样本数量。batch size 太小，训练波动大，但可能有一定泛化优势；batch size 太大，训练更稳定，但占用显存大，可能泛化变差。深度学习中通常使用 mini-batch 训练。</p><h3 id="8-5-梯度消失">8.5 梯度消失</h3><p>梯度消失是深度神经网络训练中的常见问题。反向传播时梯度需要经过多层连乘，如果每层梯度都小于 1，多层相乘后梯度会变得非常小，导致前面层参数几乎无法更新。</p><p>产生原因包括网络太深、使用 Sigmoid 或 Tanh 激活函数、参数初始化不合适、输入数据没有标准化等。</p><p>解决方法包括使用 ReLU 或 Leaky ReLU，使用 Batch Normalization，使用残差连接 ResNet，合理初始化参数，使用 LSTM 或 GRU 处理长序列，使用 Adam 等优化器。</p><h2 id="9-深度学习基础">9. 深度学习基础</h2><p>深度学习是机器学习的一个分支，主要通过多层神经网络自动学习特征。它在图像、语音、文本和大模型领域表现突出。</p><h3 id="9-1-神经网络基本结构">9.1 神经网络基本结构</h3><p>神经网络通常由输入层、隐藏层和输出层组成。每一层通过权重和偏置对输入进行线性变换，再经过激活函数引入非线性能力。</p><p>如果没有激活函数，多层线性网络仍然等价于一个线性模型，无法表达复杂非线性关系。</p><h3 id="9-2-常见激活函数">9.2 常见激活函数</h3><table><thead><tr><th>激活函数</th><th>输出范围</th><th>特点</th></tr></thead><tbody><tr><td>Sigmoid</td><td>0 到 1</td><td>可表示概率，但容易梯度消失</td></tr><tr><td>Tanh</td><td>-1 到 1</td><td>零中心，但仍可能梯度消失</td></tr><tr><td>ReLU</td><td>大于等于 0</td><td>简单高效，深度学习常用</td></tr><tr><td>Leaky ReLU</td><td>可有小负值</td><td>缓解 ReLU 死亡问题</td></tr><tr><td>Softmax</td><td>多类别概率</td><td>多分类输出层常用</td></tr></tbody></table><h3 id="9-3-常见深度学习模型">9.3 常见深度学习模型</h3><table><thead><tr><th>模型</th><th>适用场景</th></tr></thead><tbody><tr><td>CNN</td><td>图像分类、目标检测、图像特征提取</td></tr><tr><td>RNN</td><td>序列数据、时间序列、文本</td></tr><tr><td>LSTM/GRU</td><td>长序列、语音、文本，缓解长期依赖问题</td></tr><tr><td>Transformer</td><td>自然语言处理、大模型、多模态、序列建模</td></tr><tr><td>MLP</td><td>普通表格数据或基础神经网络任务</td></tr></tbody></table><h3 id="9-4-图像特征提取">9.4 图像特征提取</h3><p>传统图像特征提取方法包括 SIFT、HOG、LBP、颜色直方图和 PCA。深度学习中，CNN 可以自动学习边缘、纹理、形状和高级语义特征。</p><p>如果题目问“图像特征提取用什么算法”，可以答：传统机器学习可用 SIFT、HOG、LBP、PCA，深度学习通常用 CNN 自动提取图像特征。</p><h3 id="9-5-序列数据用什么模型">9.5 序列数据用什么模型</h3><p>序列数据指有时间顺序或上下文依赖的数据，例如文本、语音、股票价格、传感器数据和天气数据。常用模型包括 RNN、LSTM、GRU 和 Transformer。</p><h2 id="10-余弦相似度与向量空间">10. 余弦相似度与向量空间</h2><p>向量空间是机器学习中表示样本和特征的一种方式。一个样本可以看成一个向量，每个特征对应一个维度。例如一个人可以用身高、体重、年龄三个维度表示。</p><p>特征空间维度不是越大越好。维度太低可能信息不足，维度太高可能出现维度灾难、计算成本增加、模型更容易过拟合。合理做法是保留有效特征，删除无关和冗余特征，必要时用 PCA 降维。</p><p>余弦相似度用于衡量两个向量方向是否相似，公式为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">cos(θ) = A·B / (||A|| ||B||)</span><br></pre></td></tr></table></figure><p>余弦相似度关注夹角，不关注绝对长度。常用于文本相似度、推荐系统和向量检索。</p><h2 id="11-高频判断题整理">11. 高频判断题整理</h2><table><thead><tr><th>判断说法</th><th>答案</th><th>原因</th></tr></thead><tbody><tr><td>机器学习模型性能只和算法有关</td><td>错</td><td>数据质量、特征、参数和评价方式都会影响效果</td></tr><tr><td>PCA 对数据完全没有损失</td><td>错</td><td>降维会舍弃部分信息</td></tr><tr><td>PCA 属于无监督学习</td><td>对</td><td>PCA 不需要标签</td></tr><tr><td>KNN 对数据尺度不敏感</td><td>错</td><td>KNN 依赖距离，尺度差异会影响结果</td></tr><tr><td>KNN 的 K 值越大越好</td><td>错</td><td>K 太大会欠拟合</td></tr><tr><td>K-means 属于监督学习</td><td>错</td><td>K-means 没有标签，是无监督聚类</td></tr><tr><td>K-means 需要提前指定 K</td><td>对</td><td>K 是簇的数量</td></tr><tr><td>SVM 只能处理线性分类</td><td>错</td><td>可以通过核函数处理非线性问题</td></tr><tr><td>支持向量机适合高维小样本</td><td>对</td><td>这是 SVM 的常见优势</td></tr><tr><td>决策树必须进行标准化</td><td>错</td><td>决策树按阈值划分，通常不需要标准化</td></tr><tr><td>梯度下降一定能找到全局最优</td><td>错</td><td>非凸问题中不一定</td></tr><tr><td>准确率越高模型一定越好</td><td>错</td><td>类别不平衡时准确率可能误导</td></tr><tr><td>正则化可以缓解过拟合</td><td>对</td><td>正则化限制模型复杂度</td></tr><tr><td>正则化越强越好</td><td>错</td><td>过强会导致欠拟合</td></tr><tr><td>随机森林属于集成学习</td><td>对</td><td>它由多棵决策树组成</td></tr><tr><td>逻辑回归主要用于分类</td><td>对</td><td>尤其常用于二分类</td></tr><tr><td>朴素贝叶斯假设特征条件独立</td><td>对</td><td>这是其“朴素”的含义</td></tr><tr><td>深度学习一定比传统机器学习好</td><td>错</td><td>取决于数据量、任务、算力和解释性要求</td></tr></tbody></table><h2 id="12-多选题重点归纳">12. 多选题重点归纳</h2><h3 id="12-1-分类算法">12.1 分类算法</h3><p>分类算法包括逻辑回归、KNN、SVM、决策树、随机森林、朴素贝叶斯和神经网络。线性回归通常不是分类算法，K-means 也不是分类算法，而是聚类算法。</p><h3 id="12-2-分类任务例子">12.2 分类任务例子</h3><p>肿瘤良恶性判断、信用卡是否欺诈、邮件是否垃圾邮件、图像类别识别、用户是否流失，这些都属于分类任务。房价预测、销售额预测、温度预测通常属于回归任务。客户分群属于聚类任务。</p><h3 id="12-3-支持向量机相关说法">12.3 支持向量机相关说法</h3><p>正确说法：SVM 是监督学习算法；SVM 可以用于分类；SVM 可以通过核函数处理非线性问题；SVM 适合高维小样本。</p><p>错误说法：SVM 只能处理线性问题；SVM 不需要调参数；SVM 一定适合所有大规模数据。</p><h3 id="12-4-pca-相关说法">12.4 PCA 相关说法</h3><p>正确说法：PCA 是降维方法；PCA 属于无监督学习；PCA 可以通过方差贡献率衡量信息保留程度；PCA 可能造成信息损失。</p><p>错误说法：PCA 是分类算法；PCA 完全不会损失数据；PCA 不需要考虑特征尺度。</p><h3 id="12-5-集成学习算法">12.5 集成学习算法</h3><p>常见集成学习算法包括随机森林、AdaBoost、GBDT、XGBoost、LightGBM 和 Stacking。随机森林属于 Bagging 思想，Boosting 是串行训练多个弱模型，后一个模型关注前一个模型的错误。</p><h2 id="13-简答题模板">13. 简答题模板</h2><h3 id="13-1-概述机器学习的方法和分类">13.1 概述机器学习的方法和分类</h3><p>机器学习是通过数据训练模型，使计算机能够从样本中学习规律，并对未知数据进行预测、分类、聚类或决策的方法。按照学习方式可以分为监督学习、无监督学习、半监督学习和强化学习。监督学习使用带标签数据，常用于分类和回归，例如肿瘤分类、房价预测；无监督学习使用无标签数据，常用于聚类和降维，例如客户分群、PCA；半监督学习结合少量有标签数据和大量无标签数据，适合标注成本高的任务；强化学习通过奖励机制学习最优策略，常用于游戏、机器人和自动驾驶。</p><h3 id="13-2-解释欠拟合和过拟合-并说明解决方法">13.2 解释欠拟合和过拟合，并说明解决方法</h3><p>欠拟合是指模型过于简单，不能充分学习数据规律，表现为训练集和测试集效果都不好。解决方法包括增加模型复杂度、增加有效特征、减少正则化、延长训练时间或更换更强模型。过拟合是指模型过度学习训练数据中的细节和噪声，表现为训练集效果很好但测试集效果较差。解决方法包括增加数据、数据增强、降低模型复杂度、特征选择、正则化、交叉验证、早停、Dropout 和剪枝。</p><h3 id="13-3-梯度下降算法有哪些-原理是什么">13.3 梯度下降算法有哪些，原理是什么</h3><p>梯度下降是一种用于最小化损失函数的优化算法。它通过计算损失函数对参数的梯度，并沿负梯度方向更新参数，使损失逐渐减小。常见梯度下降方法包括批量梯度下降、随机梯度下降和小批量梯度下降。批量梯度下降每次使用全部样本，结果稳定但速度慢；随机梯度下降每次使用一个样本，速度快但波动大；小批量梯度下降每次使用一批样本，在效率和稳定性之间取得平衡，因此深度学习中使用较多。</p><h3 id="13-4-特征工程有哪些过程-应用-优缺点">13.4 特征工程有哪些过程、应用、优缺点</h3><p>特征工程是将原始数据转化为适合模型学习的特征的过程。主要步骤包括数据清洗、缺失值处理、异常值处理、类别编码、标准化、归一化、特征构造、特征选择和降维。它广泛应用于房价预测、信用评分、图像识别和推荐系统等任务。优点是能提高模型性能、减少噪声并增强泛化能力；缺点是依赖经验、耗时，并且错误特征可能引入噪声或造成过拟合。</p><h3 id="13-5-随机森林的构建步骤">13.5 随机森林的构建步骤</h3><p>随机森林是一种集成学习算法，由多棵决策树组成。构建时，首先从原始训练集中进行有放回抽样，得到多个训练子集；然后对每个子集训练一棵决策树；每棵树在节点分裂时随机选择部分特征参与划分；最后多棵树共同预测，分类任务采用多数投票，回归任务采用平均值。随机森林通过样本随机和特征随机降低单棵树的过拟合风险，提高模型稳定性和泛化能力。</p><h3 id="13-6-深度学习和传统机器学习的优缺点">13.6 深度学习和传统机器学习的优缺点</h3><p>传统机器学习通常依赖人工特征工程，适合中小规模数据和结构化数据，优点是训练成本较低、可解释性较强，缺点是特征表达能力有限。深度学习通过多层神经网络自动学习复杂特征，适合图像、语音、文本等大规模非结构化数据，优点是表达能力强、效果上限高，缺点是需要大量数据和算力，可解释性较差，训练过程复杂。</p><h2 id="14-讨论题模板">14. 讨论题模板</h2><h3 id="14-1-机器学习应用前景与挑战">14.1 机器学习应用前景与挑战</h3><p>机器学习在医疗诊断、金融风控、智能推荐、自动驾驶、工业检测、自然语言处理等领域具有广泛应用前景。它可以从大量数据中发现规律，提高预测效率和决策质量。例如在医疗领域可以辅助疾病诊断，在金融领域可以识别欺诈交易，在电商领域可以进行个性化推荐。但机器学习也面临数据质量差、隐私安全风险、模型可解释性不足、过拟合、算力成本高和算法偏见等挑战。因此实际应用中需要重视数据治理、模型评估、隐私保护和结果解释。</p><h3 id="14-2-怎样选择机器学习算法">14.2 怎样选择机器学习算法</h3><p>选择机器学习算法需要根据任务类型、数据规模、特征形式、准确率要求和可解释性要求综合判断。如果目标是预测连续数值，可以选择线性回归、决策树回归或随机森林回归；如果目标是分类，可以选择逻辑回归、KNN、SVM、决策树或随机森林；如果数据没有标签，可以选择 K-means 或 PCA；如果是图像、语音、文本等复杂任务，可以考虑深度学习模型。实际选择时还应通过交叉验证比较不同模型效果，而不能只凭经验判断。</p><h3 id="14-3-大数据对机器学习和深度学习的影响">14.3 大数据对机器学习和深度学习的影响</h3><p>大数据为机器学习提供了更丰富的训练样本，使模型能够学习更复杂、更稳定的规律，从而提升预测效果和泛化能力。对于深度学习来说，大量数据尤其重要，因为深层神经网络参数多，如果数据不足容易过拟合。大数据推动了推荐系统、搜索引擎、智能语音和大模型的发展。但大数据也带来了数据清洗难度增加、存储和计算成本提高、隐私风险增大、数据偏差导致不公平结果等问题。</p><h3 id="14-4-梯度消失产生原因与解决方法">14.4 梯度消失产生原因与解决方法</h3><p>梯度消失是深度神经网络训练中的常见问题。其原因是在反向传播过程中梯度需要经过多层连乘，如果每层梯度都较小，传到前面层时会变得非常接近 0，导致前面层参数难以更新。它常出现在网络较深、使用 Sigmoid 或 Tanh 激活函数、初始化不合理或输入数据未标准化的情况下。解决方法包括使用 ReLU 或 Leaky ReLU，使用 Batch Normalization，使用残差连接，合理初始化参数，使用 LSTM 或 GRU 处理序列，以及采用 Adam 等优化器。</p><h2 id="15-编程题：线性回归模板">15. 编程题：线性回归模板</h2><p>老师重点里出现“线性回归，给一组数据”。考试若要求写程序，通常考导入库、准备数据、创建模型、训练模型、预测输出。</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> LinearRegression</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 准备数据。X 必须是二维数组，y 是一维数组</span></span><br><span class="line">X = np.array([[<span class="number">1</span>], [<span class="number">2</span>], [<span class="number">3</span>], [<span class="number">4</span>], [<span class="number">5</span>]])</span><br><span class="line">y = np.array([<span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>, <span class="number">10</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 创建模型</span></span><br><span class="line">model = LinearRegression()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 训练模型</span></span><br><span class="line">model.fit(X, y)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 输出模型参数</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;斜率:&quot;</span>, model.coef_)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;截距:&quot;</span>, model.intercept_)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. 预测新数据</span></span><br><span class="line">X_new = np.array([[<span class="number">6</span>], [<span class="number">7</span>]])</span><br><span class="line">y_pred = model.predict(X_new)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;预测结果:&quot;</span>, y_pred)</span><br></pre></td></tr></table></figure><p>需要记住：<code>fit(X, y)</code> 用于训练，<code>predict(X_new)</code> 用于预测，<code>coef_</code> 是权重或斜率，<code>intercept_</code> 是截距。</p><h2 id="16-编程题：分类模型基本模板">16. 编程题：分类模型基本模板</h2><p>如果考试不是线性回归，而是要求训练一个分类模型，可以套用下面思路。</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> train_test_split</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.neighbors <span class="keyword">import</span> KNeighborsClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> accuracy_score, classification_report</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 加载数据</span></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line">y = iris.target</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 划分训练集和测试集</span></span><br><span class="line">X_train, X_test, y_train, y_test = train_test_split(</span><br><span class="line">    X, y, test_size=<span class="number">0.2</span>, random_state=<span class="number">42</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 标准化。KNN 依赖距离，建议标准化</span></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_train = scaler.fit_transform(X_train)</span><br><span class="line">X_test = scaler.transform(X_test)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 创建并训练模型</span></span><br><span class="line">model = KNeighborsClassifier(n_neighbors=<span class="number">3</span>)</span><br><span class="line">model.fit(X_train, y_train)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. 预测和评价</span></span><br><span class="line">y_pred = model.predict(X_test)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;准确率:&quot;</span>, accuracy_score(y_test, y_pred))</span><br><span class="line"><span class="built_in">print</span>(classification_report(y_test, y_pred))</span><br></pre></td></tr></table></figure><h2 id="17-编程题：k-means-和-pca-简短模板">17. 编程题：K-means 和 PCA 简短模板</h2><p>K-means 聚类示例：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.cluster <span class="keyword">import</span> KMeans</span><br><span class="line"></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line"></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_scaled = scaler.fit_transform(X)</span><br><span class="line"></span><br><span class="line">model = KMeans(n_clusters=<span class="number">3</span>, random_state=<span class="number">42</span>, n_init=<span class="number">10</span>)</span><br><span class="line">labels = model.fit_predict(X_scaled)</span><br><span class="line"><span class="built_in">print</span>(labels)</span><br><span class="line"><span class="built_in">print</span>(model.cluster_centers_)</span><br></pre></td></tr></table></figure><p>PCA 降维示例：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.decomposition <span class="keyword">import</span> PCA</span><br><span class="line"></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line"></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_scaled = scaler.fit_transform(X)</span><br><span class="line"></span><br><span class="line">pca = PCA(n_components=<span class="number">2</span>)</span><br><span class="line">X_pca = pca.fit_transform(X_scaled)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;降维后的形状:&quot;</span>, X_pca.shape)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;方差贡献率:&quot;</span>, pca.explained_variance_ratio_)</span><br></pre></td></tr></table></figure><h2 id="18-考前速记表">18. 考前速记表</h2><table><thead><tr><th>概念</th><th>一句话记忆</th></tr></thead><tbody><tr><td>分类</td><td>预测类别，例如是否患病</td></tr><tr><td>回归</td><td>预测数值，例如房价</td></tr><tr><td>聚类</td><td>无标签分组，例如客户分群</td></tr><tr><td>降维</td><td>减少特征数量，例如 PCA</td></tr><tr><td>KNN</td><td>看最近 K 个邻居投票</td></tr><tr><td>K-means</td><td>把样本分成 K 个簇</td></tr><tr><td>SVM</td><td>找最大间隔分类超平面</td></tr><tr><td>决策树</td><td>一层层条件判断</td></tr><tr><td>随机森林</td><td>多棵决策树投票</td></tr><tr><td>朴素贝叶斯</td><td>贝叶斯公式加特征独立假设</td></tr><tr><td>PCA</td><td>找方差最大的方向，保留主要信息</td></tr><tr><td>正则化</td><td>给复杂模型加惩罚，缓解过拟合</td></tr><tr><td>梯度下降</td><td>沿负梯度方向更新参数</td></tr><tr><td>交叉验证</td><td>更稳定评估模型泛化能力</td></tr><tr><td>batch size</td><td>每次训练送入模型的一批样本数</td></tr><tr><td>梯度消失</td><td>深层网络前面层梯度太小，学不动</td></tr></tbody></table><h2 id="19-最后复习顺序建议">19. 最后复习顺序建议</h2><p>第一轮先看机器学习分类、分类回归聚类降维区别、KNN、SVM、决策树、随机森林、K-means 和 PCA。第二轮重点背过拟合欠拟合、正则化、梯度下降、评价指标和交叉验证。第三轮练简答题模板和编程题模板。</p><p>最优先掌握的判断：PCA 是降维不是分类；KNN 是监督学习，K-means 是无监督学习；逻辑回归主要用于分类；SVM 可以通过核函数处理非线性；决策树一般不需要标准化；准确率高不一定模型好；梯度下降不一定在非凸问题中找到全局最优；正则化可以缓解过拟合但不是越强越好。</p><h2 id="20-自测题：先做题-再看答案解析">20. 自测题：先做题，再看答案解析</h2><p>这一部分是按老师画的重点和常见期末题型补充的自测题。建议先单独写答案，不要边看答案边做。做完以后重点检查三类错误：把 KNN 和 K-means 混淆，把逻辑回归当成普通回归，把准确率当成唯一评价指标。</p><p>建议用时：判断题 5 分钟，单选题 15 分钟，多选题 15 分钟，简答题 25 分钟，编程题 25 分钟，综合题 20 分钟。总分可以按 100 分计算：判断 15 分，单选 15 分，多选 20 分，简答 24 分，编程 15 分，综合 11 分。</p><h3 id="20-1-判断题">20.1 判断题</h3><ol><li>机器学习模型的效果只由算法决定，数据质量和特征工程影响不大。</li><li>监督学习通常需要带标签的数据。</li><li>逻辑回归主要用于预测连续数值，所以它和线性回归用途基本相同。</li><li>KNN 依赖距离计算，因此不同特征量纲差异很大时，通常需要标准化或归一化。</li><li>决策树通常不依赖距离计算，因此一般不强制要求标准化。</li><li>PCA 降维完全不会造成信息损失。</li><li>SVM 可以通过核函数处理非线性分类问题。</li><li>准确率越高，模型一定越适合实际应用。</li><li>L2 正则化可以限制参数过大，从而缓解过拟合。</li><li>K-means 属于监督学习，因为它会把样本分成不同类别。</li><li>梯度下降在所有机器学习模型中都一定能找到全局最优解。</li><li>交叉验证可以更稳定地评估模型泛化能力，也常用于选择超参数。</li><li>batch size 越大越好，因为每次使用的数据越多，模型一定泛化越强。</li><li>随机森林属于集成学习，它由多棵决策树组成。</li><li>深度学习一定优于传统机器学习，因此任何数据集都应该优先使用深度学习。</li></ol><h3 id="20-2-单选题">20.2 单选题</h3><ol><li><p>下列任务最典型属于分类问题的是哪一项？<br>A. 预测明天最高气温  B. 判断肿瘤是良性还是恶性  C. 预测房屋价格  D. 预测某商品月销量</p></li><li><p>下列任务最典型属于回归问题的是哪一项？<br>A. 预测房价  B. 判断邮件是否为垃圾邮件  C. 对客户进行分群  D. 将图片分为猫和狗</p></li><li><p>下列算法中，通常属于无监督学习的是哪一项？<br>A. 逻辑回归  B. SVM  C. K-means  D. 朴素贝叶斯</p></li><li><p>PCA 的主要作用是下列哪一项？<br>A. 分类  B. 降维  C. 生成标签  D. 增加样本数量</p></li><li><p>KNN 对标准化敏感的主要原因是下列哪一项？<br>A. KNN 使用神经网络训练  B. KNN 使用决策树分裂  C. KNN 依赖样本间距离  D. KNN 只能处理文本数据</p></li><li><p>在 SVM 中，支持向量指的是下列哪一类样本？<br>A. 所有训练样本  B. 被错误分类的样本  C. 离分类边界最近并决定边界的样本  D. 测试集中的样本</p></li><li><p>过拟合的典型表现是下列哪一项？<br>A. 训练集差，测试集也差  B. 训练集好，测试集差  C. 训练集差，测试集好  D. 训练集和测试集都完全一样</p></li><li><p>梯度下降更新参数时，一般沿哪个方向更新？<br>A. 正梯度方向  B. 随机方向  C. 负梯度方向  D. 与梯度无关的方向</p></li><li><p>CART 决策树常用的划分指标是哪一项？<br>A. 余弦相似度  B. 欧氏距离  C. 方差贡献率  D. 基尼指数</p></li><li><p>朴素贝叶斯中“朴素”的主要含义是哪一项？<br>A. 假设特征在类别条件下相互独立  B. 模型没有参数  C. 模型不需要训练数据  D. 只能用于回归</p></li><li><p>在类别极不平衡的数据中，只看准确率可能产生什么问题？<br>A. 准确率无法计算  B. 模型训练会停止  C. 可能掩盖少数类识别效果差的问题  D. 一定导致欠拟合</p></li><li><p>随机森林降低过拟合风险主要依靠哪种思想？<br>A. 只训练一棵很深的树  B. 多棵树集成，并引入样本随机和特征随机  C. 不使用训练集  D. 不使用任何特征</p></li><li><p>选择 K-means 中 K 值的常见方法是下列哪一项？<br>A. 肘部法和轮廓系数  B. Sigmoid 函数  C. 梯度消失法  D. 贝叶斯公式</p></li><li><p>Sigmoid 函数的输出范围通常是下列哪一项？<br>A. 负无穷到正无穷  B. 0 到 1  C. -1 到 1  D. 只能输出整数</p></li><li><p>验证集的主要作用是下列哪一项？<br>A. 最终报告模型性能  B. 直接替代训练集  C. 选择模型和调整超参数  D. 删除全部异常值</p></li></ol><h3 id="20-3-多选题">20.3 多选题</h3><ol><li><p>下列哪些算法通常可以用于分类任务？<br>A. 逻辑回归  B. KNN  C. SVM  D. 决策树  E. 随机森林  F. 朴素贝叶斯</p></li><li><p>下列哪些因素会影响 KNN 的效果？<br>A. K 值大小  B. 距离度量方式  C. 是否进行标准化  D. 噪声和异常值  E. 特征是否有效</p></li><li><p>下列关于 PCA 的说法，正确的有哪些？<br>A. PCA 是常见降维方法  B. PCA 一般属于无监督学习  C. PCA 可用方差贡献率衡量信息保留程度  D. PCA 完全不会损失信息  E. PCA 不是分类算法</p></li><li><p>下列哪些方法可以缓解过拟合？<br>A. 增加数据  B. 正则化  C. 决策树剪枝  D. 早停  E. 特征选择  F. 无限增加模型复杂度</p></li><li><p>下列哪些是分类任务常见评价指标？<br>A. Accuracy  B. Precision  C. Recall  D. F1-score  E. AUC  F. MSE</p></li><li><p>下列哪些方法有助于缓解深度学习中的梯度消失？<br>A. 使用 ReLU 或 Leaky ReLU  B. 使用 Batch Normalization  C. 使用残差连接  D. 合理初始化参数  E. 一定使用更小的数据集</p></li><li><p>下列哪些模型通常不强制要求标准化？<br>A. 决策树  B. 随机森林  C. KNN  D. K-means  E. SVM</p></li><li><p>下列哪些属于聚类算法或聚类方法？<br>A. K-means  B. 层次聚类  C. DBSCAN  D. 高斯混合模型  E. 线性回归</p></li><li><p>下列哪些属于特征工程或数据预处理的内容？<br>A. 缺失值处理  B. 异常值处理  C. 类别编码  D. 标准化  E. 特征选择  F. PCA 降维</p></li><li><p>下列关于正则化的说法，正确的有哪些？<br>A. 正则化可以缓解过拟合  B. L1 正则化可能使部分参数变为 0  C. L2 正则化通常会让参数变小  D. 正则化越强越好  E. 正则化过强可能导致欠拟合</p></li></ol><h3 id="20-4-简答题">20.4 简答题</h3><ol><li>简述机器学习的基本思想，并说明监督学习、无监督学习、半监督学习和强化学习的区别。</li><li>解释分类、回归、聚类和降维的区别，并各举一个例子。</li><li>简述 KNN 算法的基本流程，并说明 K 值过大和过小分别可能带来什么问题。</li><li>简述 SVM 的核心思想，并说明它为什么可以处理非线性分类问题。</li><li>什么是过拟合和欠拟合？分别有哪些常见解决方法？</li><li>什么是特征工程？请说明常见步骤、应用和优缺点。</li><li>简述随机森林的构建步骤，并说明它相比单棵决策树的优势。</li><li>为什么在类别不平衡的数据中，不能只看准确率？请结合例子说明。</li></ol><h3 id="20-5-编程题">20.5 编程题</h3><ol><li>给定一组一维数据 <code>X = [[1], [2], [3], [4], [5]]</code>，目标值 <code>y = [3, 5, 7, 9, 11]</code>，请使用 sklearn 写出线性回归训练、输出斜率和截距、预测 <code>X_new = [[6]]</code> 的代码。</li><li>使用鸢尾花数据集训练一个 KNN 分类模型，要求包括加载数据、划分训练测试集、标准化、训练模型、预测并输出准确率。</li><li>使用鸢尾花数据集做 K-means 聚类，要求先标准化，再设置 <code>n_clusters=3</code>，输出每个样本的聚类标签。</li><li>使用鸢尾花数据集做 PCA 降维，要求先标准化，再降到 2 维，输出降维后的数据形状和方差贡献率。</li></ol><h3 id="20-6-综合应用题">20.6 综合应用题</h3><ol><li>某医院有 10000 条体检数据，其中真正患某疾病的人只有 100 人。一个模型把所有人都预测为健康。请分析这个模型的准确率是否高，为什么这个模型仍然不可用，应该关注哪些指标。</li><li>某电商平台希望把用户分成不同消费群体，但没有提前标注每个用户属于哪一类。请说明这是分类还是聚类问题，可以选什么算法，数据预处理时要注意什么。</li><li>某模型训练集准确率为 99%，测试集准确率为 70%。请判断可能出现了什么问题，并给出至少 4 种改进方法。</li></ol><h2 id="21-自测题答案与解析">21. 自测题答案与解析</h2><h3 id="21-1-判断题答案">21.1 判断题答案</h3><ol><li>错。算法只是一个因素，数据质量、特征工程、训练方式、参数选择和评价指标都会影响模型效果。</li><li>对。监督学习使用带标签样本学习输入到输出的映射。</li><li>错。逻辑回归主要用于分类，尤其是二分类；线性回归主要用于预测连续数值。</li><li>对。KNN 使用距离判断邻近样本，尺度大的特征会不合理地主导距离。</li><li>对。决策树按阈值划分特征，通常不像 KNN、SVM 那样依赖特征尺度。</li><li>错。PCA 降维会舍弃部分方向的信息，保留主成分越少，信息损失风险越高。</li><li>对。SVM 可以借助核函数处理非线性可分问题。</li><li>错。类别不平衡时，准确率可能很高但少数类识别很差。</li><li>对。L2 正则化通过惩罚参数平方，使参数更小、更平滑。</li><li>错。K-means 没有标签参与训练，属于无监督聚类。</li><li>错。非凸问题中可能陷入局部最优、鞍点或震荡。</li><li>对。交叉验证能减少单次划分带来的偶然性，并用于超参数选择。</li><li>错。batch size 过大可能占用显存高，也不一定带来更好的泛化。</li><li>对。随机森林通过多棵决策树投票或平均进行预测。</li><li>错。深度学习需要大量数据和算力，可解释性较弱，小数据结构化任务未必优于传统方法。</li></ol><h3 id="21-2-单选题答案">21.2 单选题答案</h3><ol><li>B。肿瘤良恶性是离散类别判断，属于分类。</li><li>A。房价是连续数值，属于回归。</li><li>C。K-means 不使用标签，属于无监督聚类。</li><li>B。PCA 的主要作用是降维，同时尽量保留主要信息。</li><li>C。KNN 依赖距离，尺度差异会直接影响最近邻选择。</li><li>C。支持向量是靠近分类边界、决定最大间隔超平面的样本。</li><li>B。训练集好但测试集差，是过拟合的典型表现。</li><li>C。梯度下降通常沿负梯度方向更新参数，使损失减小。</li><li>D。CART 常用基尼指数进行划分。</li><li>A。朴素贝叶斯的核心假设是特征条件独立。</li><li>C。多数类占比很大时，模型只预测多数类也可能得到高准确率。</li><li>B。随机森林通过样本随机和特征随机训练多棵树，降低单棵树过拟合风险。</li><li>A。K-means 常用肘部法和轮廓系数选择 K。</li><li>B。Sigmoid 输出范围是 0 到 1，可解释为概率。</li><li>C。验证集主要用于模型选择和超参数调整，测试集用于最终评估。</li></ol><h3 id="21-3-多选题答案">21.3 多选题答案</h3><ol><li>A、B、C、D、E、F。六个选项都可以用于分类任务。</li><li>A、B、C、D、E。KNN 对 K 值、距离、尺度、噪声和特征质量都敏感。</li><li>A、B、C、E。D 错，PCA 降维可能损失信息。</li><li>A、B、C、D、E。F 错，无限增加复杂度通常会加重过拟合。</li><li>A、B、C、D、E。F 是回归指标，不是分类指标。</li><li>A、B、C、D。E 错，数据更少通常会增加过拟合风险，也不能解决梯度消失。</li><li>A、B。决策树和随机森林一般不强制要求标准化。KNN、K-means、SVM 通常更依赖尺度。</li><li>A、B、C、D。线性回归是回归算法，不是聚类算法。</li><li>A、B、C、D、E、F。这些都属于数据预处理或特征工程范围。</li><li>A、B、C、E。D 错，正则化过强会导致欠拟合。</li></ol><h3 id="21-4-简答题参考答案">21.4 简答题参考答案</h3><ol><li><p>机器学习是通过数据训练模型，使计算机从样本中学习规律，并对未知数据进行预测、分类、聚类或决策。监督学习使用带标签数据，常用于分类和回归；无监督学习使用无标签数据，常用于聚类和降维；半监督学习结合少量有标签数据和大量无标签数据，适合标注成本高的任务；强化学习通过奖励信号学习最优策略，常用于游戏、机器人控制和自动驾驶。</p></li><li><p>分类预测离散类别，例如判断邮件是否为垃圾邮件；回归预测连续数值，例如预测房价；聚类是在没有标签时把相似样本分到同一组，例如客户分群；降维是减少特征数量并尽量保留主要信息，例如用 PCA 把高维特征压缩成二维用于可视化。</p></li><li><p>KNN 的流程是先选择 K 值，然后计算待预测样本与训练样本之间的距离，选出最近的 K 个邻居，分类任务用多数投票，回归任务用平均值。K 过小容易受噪声影响，导致过拟合；K 过大会使分类边界过于平滑，容易欠拟合。</p></li><li><p>SVM 的核心思想是寻找一个最优分类超平面，使不同类别之间的间隔最大。离分类边界最近的样本称为支持向量，它们决定分类边界。SVM 可以通过核函数把原始数据映射到更高维空间，使非线性问题在高维空间中更容易线性划分，因此可以处理非线性分类。</p></li><li><p>欠拟合是模型太简单，训练集和测试集效果都差；可通过增加模型复杂度、增加有效特征、减少正则化、延长训练等方法改善。过拟合是模型过度学习训练数据细节和噪声，训练集好而测试集差；可通过增加数据、数据增强、正则化、特征选择、降低复杂度、交叉验证、早停、Dropout 或剪枝改善。</p></li><li><p>特征工程是将原始数据转化为更适合模型学习的特征的过程。常见步骤包括缺失值处理、异常值处理、类别编码、标准化或归一化、特征构造、特征选择和降维。它可用于房价预测、信用评分、图像识别和推荐系统。优点是提升模型效果、减少噪声、增强泛化能力；缺点是依赖经验、耗时，错误特征可能引入噪声或造成过拟合。</p></li><li><p>随机森林先对训练集进行有放回抽样，生成多个子数据集；然后分别训练多棵决策树；每棵树在节点划分时随机选择部分特征；最后分类任务用多数投票，回归任务用平均值。相比单棵决策树，随机森林更稳定，泛化能力更强，不容易过拟合，还可以评估特征重要性。</p></li><li><p>类别不平衡时，准确率可能被多数类掩盖。例如 1000 个样本中只有 10 个患病，模型全部预测健康也有 99% 准确率，但没有识别出任何患病者。此时应关注召回率、精确率、F1-score、AUC 和混淆矩阵，尤其在疾病检测中，漏诊代价高，召回率非常重要。</p></li></ol><h3 id="21-5-编程题参考答案">21.5 编程题参考答案</h3><p>线性回归参考代码：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> LinearRegression</span><br><span class="line"></span><br><span class="line">X = np.array([[<span class="number">1</span>], [<span class="number">2</span>], [<span class="number">3</span>], [<span class="number">4</span>], [<span class="number">5</span>]])</span><br><span class="line">y = np.array([<span class="number">3</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">9</span>, <span class="number">11</span>])</span><br><span class="line"></span><br><span class="line">model = LinearRegression()</span><br><span class="line">model.fit(X, y)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;斜率:&quot;</span>, model.coef_)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;截距:&quot;</span>, model.intercept_)</span><br><span class="line"></span><br><span class="line">X_new = np.array([[<span class="number">6</span>]])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;预测结果:&quot;</span>, model.predict(X_new))</span><br></pre></td></tr></table></figure><p>KNN 分类参考代码：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> train_test_split</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.neighbors <span class="keyword">import</span> KNeighborsClassifier</span><br><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> accuracy_score</span><br><span class="line"></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line">y = iris.target</span><br><span class="line"></span><br><span class="line">X_train, X_test, y_train, y_test = train_test_split(</span><br><span class="line">    X, y, test_size=<span class="number">0.2</span>, random_state=<span class="number">42</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_train = scaler.fit_transform(X_train)</span><br><span class="line">X_test = scaler.transform(X_test)</span><br><span class="line"></span><br><span class="line">model = KNeighborsClassifier(n_neighbors=<span class="number">3</span>)</span><br><span class="line">model.fit(X_train, y_train)</span><br><span class="line"></span><br><span class="line">y_pred = model.predict(X_test)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;准确率:&quot;</span>, accuracy_score(y_test, y_pred))</span><br></pre></td></tr></table></figure><p>K-means 聚类参考代码：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.cluster <span class="keyword">import</span> KMeans</span><br><span class="line"></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line"></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_scaled = scaler.fit_transform(X)</span><br><span class="line"></span><br><span class="line">model = KMeans(n_clusters=<span class="number">3</span>, random_state=<span class="number">42</span>, n_init=<span class="number">10</span>)</span><br><span class="line">labels = model.fit_predict(X_scaled)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;聚类标签:&quot;</span>, labels)</span><br></pre></td></tr></table></figure><p>PCA 降维参考代码：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.datasets <span class="keyword">import</span> load_iris</span><br><span class="line"><span class="keyword">from</span> sklearn.preprocessing <span class="keyword">import</span> StandardScaler</span><br><span class="line"><span class="keyword">from</span> sklearn.decomposition <span class="keyword">import</span> PCA</span><br><span class="line"></span><br><span class="line">iris = load_iris()</span><br><span class="line">X = iris.data</span><br><span class="line"></span><br><span class="line">scaler = StandardScaler()</span><br><span class="line">X_scaled = scaler.fit_transform(X)</span><br><span class="line"></span><br><span class="line">pca = PCA(n_components=<span class="number">2</span>)</span><br><span class="line">X_pca = pca.fit_transform(X_scaled)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;降维后的形状:&quot;</span>, X_pca.shape)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;方差贡献率:&quot;</span>, pca.explained_variance_ratio_)</span><br></pre></td></tr></table></figure><h3 id="21-6-综合应用题参考答案">21.6 综合应用题参考答案</h3><ol><li><p>这个模型准确率为 9900/10000 = 99%，表面上很高，但它把所有患病者都预测为健康，患病类召回率为 0，因此实际不可用。疾病检测中漏诊代价高，不能只看准确率，应关注召回率、精确率、F1-score、AUC 和混淆矩阵。如果任务目标是尽量找出患病者，应优先提高召回率，同时控制误报。</p></li><li><p>这是聚类问题，因为平台没有预先标注用户类别，目标是让模型根据用户行为自动发现群体结构。可以选择 K-means、层次聚类或 DBSCAN。预处理时应处理缺失值和异常值，对消费金额、购买频率、浏览次数等数值特征进行标准化，必要时用 PCA 降维，还要结合业务含义解释每个簇。</p></li><li><p>训练集准确率 99%，测试集准确率 70%，说明模型可能过拟合。改进方法包括增加训练数据、进行数据增强、减少模型复杂度、加入 L1 或 L2 正则化、使用交叉验证选择超参数、进行特征选择、对决策树进行剪枝、使用早停、检查数据泄漏和标签错误等。</p></li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;机器学习期末复习资料：老师重点整理版&quot;&gt;机器学习期末复习资料：老师重点整理版&lt;/h1&gt;
&lt;h2 id=&quot;0-使用说明与重点来源&quot;&gt;0.</summary>
        
      
    
    
    
    <category term="课程复习" scheme="https://college-github-io.pages.dev/categories/%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/"/>
    
    
    <category term="机器学习" scheme="https://college-github-io.pages.dev/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="期末复习" scheme="https://college-github-io.pages.dev/tags/%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/"/>
    
    <category term="自测题" scheme="https://college-github-io.pages.dev/tags/%E8%87%AA%E6%B5%8B%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>学校-计网知识点总结</title>
    <link href="https://college-github-io.pages.dev/posts/a9c9fde9/"/>
    <id>https://college-github-io.pages.dev/posts/a9c9fde9/</id>
    <published>2026-06-07T09:27:00.000Z</published>
    <updated>2026-06-07T09:21:53.229Z</updated>
    
    <content type="html"><![CDATA[<h1 id="computer-network-期末中文复习资料详细版">Computer Network 期末中文复习资料详细版</h1><blockquote><p>说明：本资料按你上传的期末复习提纲和照片中的参考题整理。正文用中文讲解，关键英文术语保留在括号中，方便你理解后再转成英文答题。照片中个别题目因拍摄角度不完整，原题按可识别内容整理，若不影响题意则做了少量顺句处理。</p></blockquote><hr><h2 id="0-考试范围与复习优先级">0. 考试范围与复习优先级</h2><h3 id="0-1-题型和分值">0.1 题型和分值</h3><table><thead><tr><th>题型</th><th style="text-align:right">数量</th><th style="text-align:right">分值</th><th>复习策略</th></tr></thead><tbody><tr><td>判断题</td><td style="text-align:right">10 题</td><td style="text-align:right">10 分</td><td>记概念、协议特点、设备层次</td></tr><tr><td>选择题</td><td style="text-align:right">20 题</td><td style="text-align:right">20 分</td><td>记关键定义、协议区别、字段含义</td></tr><tr><td>计算题</td><td style="text-align:right">5 题</td><td style="text-align:right">40 分</td><td>重点练时延、信道容量、CSMA/CD、CIDR、IP 分片、TCP 窗口</td></tr><tr><td>综合应用题</td><td style="text-align:right">3 题</td><td style="text-align:right">30 分</td><td>重点练子网划分、路由表、RIP 更新、TCP 序号确认号</td></tr></tbody></table><h3 id="0-2-最高优先级章节">0.2 最高优先级章节</h3><ol><li><strong>第四章 网络层</strong>：CIDR、子网划分、路由表、最长前缀匹配、IP 分片、ARP、RIP、NAT。</li><li><strong>第五章 运输层</strong>：UDP/TCP 区别、TCP 首部、序号和确认号、窗口、三次握手、四次挥手。</li><li><strong>第三章 数据链路层</strong>：CSMA/CD、争用期、最小帧长、二进制指数退避、MAC 帧格式。</li><li><strong>第一、二章计算基础</strong>：时延、传播时延、发送时延、奈奎斯特、码元速率、CDMA。</li></ol><hr><h1 id="第一部分：详细知识点">第一部分：详细知识点</h1><h2 id="第一章-概述">第一章 概述</h2><h3 id="1-1-网络协议的概念">1.1 网络协议的概念</h3><p><strong>网络协议（network protocol）</strong> 是通信双方必须共同遵守的规则集合。协议通常包括三个要素：</p><table><thead><tr><th>要素</th><th>含义</th><th>举例</th></tr></thead><tbody><tr><td>语法 syntax</td><td>数据和控制信息的格式</td><td>IP 首部中源地址和目的地址各占 32 bit</td></tr><tr><td>语义 semantics</td><td>每个字段或控制信息代表什么</td><td>TCP 中 SYN=1 表示请求建立连接</td></tr><tr><td>同步 timing</td><td>通信双方动作的先后顺序和速率匹配</td><td>TCP 三次握手先 SYN，再 SYN+ACK，再 ACK</td></tr></tbody></table><p><strong>理解例子</strong>：两个人打电话时，语言相当于语法，话的含义相当于语义，谁先说、什么时候回应相当于同步。网络通信也一样，只有格式、含义和时序都一致，双方才能正确通信。</p><hr><h3 id="1-2-计算机网络按作用范围分类">1.2 计算机网络按作用范围分类</h3><table><thead><tr><th>类型</th><th>英文</th><th>范围</th><th>例子</th></tr></thead><tbody><tr><td>个人区域网</td><td>PAN</td><td>几米到十几米</td><td>蓝牙耳机连接手机</td></tr><tr><td>局域网</td><td>LAN</td><td>一个房间、楼层、校园局部</td><td>实验室以太网</td></tr><tr><td>城域网</td><td>MAN</td><td>一个城市</td><td>城市教育网</td></tr><tr><td>广域网</td><td>WAN</td><td>跨地区、跨国家</td><td>运营商骨干网</td></tr><tr><td>互联网</td><td>Internet</td><td>全球互连网络</td><td>公共互联网</td></tr></tbody></table><p><strong>易错点</strong>：互联网不是单个网络，而是许多异构网络通过路由器互连形成的网络集合。</p><hr><h3 id="1-3-互联网按工作方式划分">1.3 互联网按工作方式划分</h3><p>从功能角度看，互联网可以分为：</p><ol><li><strong>边缘部分（edge part）</strong>：由主机、服务器、客户端组成，主要给用户提供服务。</li><li><strong>核心部分（core part）</strong>：由路由器和高速链路组成，主要负责分组交换和路由转发。</li></ol><p>从通信模式看，常见有：</p><table><thead><tr><th>模式</th><th>特点</th><th>例子</th></tr></thead><tbody><tr><td>客户服务器方式 C/S</td><td>客户端请求，服务器响应</td><td>浏览器访问网页</td></tr><tr><td>对等方式 P2P</td><td>主机之间地位相对平等</td><td>BT 下载、P2P 文件共享</td></tr></tbody></table><hr><h3 id="1-4-报文交换和分组交换">1.4 报文交换和分组交换</h3><table><thead><tr><th>项目</th><th>报文交换 message switching</th><th>分组交换 packet switching</th></tr></thead><tbody><tr><td>传输单位</td><td>完整报文</td><td>把报文切成较小分组</td></tr><tr><td>存储转发</td><td>整个报文到达后再转发</td><td>每个分组到达后即可转发</td></tr><tr><td>时延</td><td>大报文时延大</td><td>更适合突发数据</td></tr><tr><td>缓存要求</td><td>高</td><td>较低</td></tr><tr><td>当前互联网</td><td>很少直接使用</td><td>主要采用分组交换</td></tr></tbody></table><p><strong>举例</strong>：发送一个 100 MB 文件，如果采用报文交换，中间节点必须先收到完整 100 MB 才能转发；如果采用分组交换，可以切成很多小分组，前面的分组先转发，后面的分组继续传输，整体效率更高。</p><hr><h3 id="1-5-计算机网络性能指标">1.5 计算机网络性能指标</h3><h4 id="1-5-1-速率-带宽-吞吐量">1.5.1 速率、带宽、吞吐量</h4><table><thead><tr><th>指标</th><th>含义</th><th>单位</th><th>注意点</th></tr></thead><tbody><tr><td>速率 data rate</td><td>数据传输速率</td><td>bit/s</td><td>1 Mbit/s = 10^6 bit/s</td></tr><tr><td>带宽 bandwidth</td><td>网络理论最高传输能力</td><td>bit/s</td><td>不是日常说的“频带宽度”时，常指最高数据率</td></tr><tr><td>吞吐量 throughput</td><td>实际通过网络的数据量</td><td>bit/s</td><td>通常小于带宽</td></tr></tbody></table><p><strong>例子</strong>：你的宽带标称 100 Mbit/s，这是带宽；实际下载只有 70 Mbit/s，这是吞吐量。</p><h4 id="1-5-2-时延-delay">1.5.2 时延 delay</h4><p>总时延通常由四部分构成：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延</span><br></pre></td></tr></table></figure><table><thead><tr><th>时延</th><th>公式</th><th>含义</th></tr></thead><tbody><tr><td>发送时延 transmission delay</td><td>数据长度 / 发送速率</td><td>把所有 bit 推到链路上所需时间</td></tr><tr><td>传播时延 propagation delay</td><td>链路长度 / 信号传播速率</td><td>信号在介质中传播所需时间</td></tr><tr><td>处理时延 processing delay</td><td>无固定公式</td><td>路由器检查首部、查表等</td></tr><tr><td>排队时延 queuing delay</td><td>无固定公式</td><td>分组等待输出链路空闲的时间</td></tr></tbody></table><p><strong>关键区别</strong>：发送时延和数据长度有关，传播时延和距离有关。发送一个很大的文件时，发送时延可能占主导；发送一个很小的分组到很远的地方时，传播时延可能占主导。</p><h4 id="1-5-3-往返时间-rtt">1.5.3 往返时间 RTT</h4><p>RTT（round-trip time）是从发送方发送一个短报文开始，到收到对方确认所经过的时间。TCP 计算超时重传时间时会用到 RTT。</p><h4 id="1-5-4-利用率">1.5.4 利用率</h4><p>利用率表示链路或网络资源被使用的比例。利用率过低说明资源浪费，利用率过高则可能导致排队时延快速增加。</p><hr><h3 id="1-6-计算机网络体系结构">1.6 计算机网络体系结构</h3><p>网络体系结构采用分层思想。每一层只向上层提供服务，并使用下层提供的服务。</p><table><thead><tr><th>概念</th><th>含义</th><th>举例</th></tr></thead><tbody><tr><td>实体 entity</td><td>某一层中实现协议的活动元素</td><td>TCP 实体、IP 实体</td></tr><tr><td>对等层 peer layer</td><td>不同主机中同一层</td><td>主机 A 的 TCP 与主机 B 的 TCP</td></tr><tr><td>协议 protocol</td><td>对等层之间通信的规则</td><td>TCP、IP、HTTP</td></tr><tr><td>服务 service</td><td>下层向上层提供的功能</td><td>IP 为 TCP 提供尽力而为交付</td></tr><tr><td>协议数据单元 PDU</td><td>每层传输的数据单位</td><td>帧、IP 数据报、TCP 报文段</td></tr></tbody></table><hr><h2 id="第二章-物理层">第二章 物理层</h2><h3 id="2-1-信道极限容量">2.1 信道极限容量</h3><p>信道容量受到两个因素限制：</p><ol><li><strong>奈奎斯特准则（Nyquist）</strong>：无噪声但带宽有限时，码元速率不能无限提高。</li><li><strong>香农公式（Shannon）</strong>：有噪声信道中，信道容量受带宽和信噪比限制。</li></ol><h4 id="奈奎斯特公式">奈奎斯特公式</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">最高数据率 = 2W log2(V)</span><br></pre></td></tr></table></figure><p>其中：</p><ul><li>W 是信道带宽，单位 Hz。</li><li>V 是每个码元可取的离散电平数。</li><li>log2(V) 表示每个码元携带多少 bit。</li></ul><p><strong>例子</strong>：若最高码元速率为 20000 baud，采用 16 个不同电平，则每个码元携带 log2(16)=4 bit，最高数据率为 20000×4=80000 bit/s。</p><h4 id="香农公式">香农公式</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">C = W log2(1 + S/N)</span><br></pre></td></tr></table></figure><p>其中：</p><ul><li>C 是信道容量。</li><li>W 是带宽。</li><li>S/N 是信噪比的普通数值形式，不是 dB 形式。</li></ul><p>若题目给出信噪比 dB，需要先换算：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">S/N(dB) = 10 log10(S/N)</span><br></pre></td></tr></table></figure><hr><h3 id="2-2-比特率和波特率">2.2 比特率和波特率</h3><table><thead><tr><th>概念</th><th>英文</th><th>含义</th><th>单位</th></tr></thead><tbody><tr><td>比特率</td><td>bit rate</td><td>每秒传输多少 bit</td><td>bit/s</td></tr><tr><td>波特率</td><td>baud rate</td><td>每秒传输多少个码元</td><td>baud</td></tr></tbody></table><p>二者关系：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">比特率 = 波特率 × 每个码元携带的 bit 数</span><br></pre></td></tr></table></figure><p>若有 V 种离散状态，则：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">每个码元携带 log2(V) bit</span><br></pre></td></tr></table></figure><p><strong>例子</strong>：若波特率为 1000 baud，每个码元有 8 种状态，则每个码元携带 log2(8)=3 bit，比特率为 3000 bit/s。</p><hr><h3 id="2-3-信道复用技术">2.3 信道复用技术</h3><table><thead><tr><th>复用方式</th><th>英文</th><th>思想</th><th>例子</th></tr></thead><tbody><tr><td>频分复用</td><td>FDM</td><td>不同用户占用不同频带</td><td>广播电台不同频率</td></tr><tr><td>时分复用</td><td>TDM</td><td>不同用户轮流占用时间片</td><td>传统电话复用</td></tr><tr><td>统计时分复用</td><td>STDM</td><td>按实际需求动态分配时间片</td><td>分组交换中的动态共享</td></tr><tr><td>波分复用</td><td>WDM</td><td>光纤中不同波长传不同信号</td><td>光纤骨干网</td></tr><tr><td>码分复用</td><td>CDM/CDMA</td><td>不同用户使用不同码片序列</td><td>移动通信中的扩频技术</td></tr></tbody></table><h3 id="2-4-cdma-的计算方法">2.4 CDMA 的计算方法</h3><p>CDMA 的核心是不同站点的码片序列互相正交。判断某个站是否发送数据时，用接收序列和该站码片序列做内积，再除以码片长度。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">结果 = 接收序列 · 某站码片序列 / 码片长度</span><br></pre></td></tr></table></figure><p>判断规则：</p><table><thead><tr><th style="text-align:right">结果</th><th>含义</th></tr></thead><tbody><tr><td style="text-align:right">+1</td><td>该站发送 bit 1</td></tr><tr><td style="text-align:right">-1</td><td>该站发送 bit 0</td></tr><tr><td style="text-align:right">0</td><td>该站没有发送</td></tr></tbody></table><hr><h2 id="第三章-数据链路层">第三章 数据链路层</h2><h3 id="3-1-静态和动态划分信道">3.1 静态和动态划分信道</h3><table><thead><tr><th>方法</th><th>类型</th><th>特点</th></tr></thead><tbody><tr><td>FDM、TDM、WDM、CDMA</td><td>静态划分</td><td>资源预先分配，冲突少，但空闲时可能浪费</td></tr><tr><td>ALOHA、CSMA、CSMA/CD</td><td>动态划分</td><td>按需竞争信道，适合突发数据</td></tr></tbody></table><hr><h3 id="3-2-csma-cd-协议">3.2 CSMA/CD 协议</h3><p>CSMA/CD 是传统共享式以太网使用的介质访问控制协议。</p><p>全称：Carrier Sense Multiple Access with Collision Detection，载波监听多点接入/碰撞检测。</p><p>工作过程：</p><ol><li><strong>先听后发</strong>：发送前先监听信道。</li><li><strong>边发边听</strong>：发送过程中继续检测是否发生碰撞。</li><li><strong>碰撞停止</strong>：一旦检测到碰撞，立即停止发送。</li><li><strong>发送干扰信号</strong>：让所有站都知道发生碰撞。</li><li><strong>随机退避</strong>：等待一段随机时间后重发。</li></ol><p><strong>适用条件</strong>：CSMA/CD 适合半双工共享式以太网。现代交换式全双工以太网基本不再使用 CSMA/CD。</p><hr><h3 id="3-3-争用期和最小帧长">3.3 争用期和最小帧长</h3><h4 id="争用期">争用期</h4><p>争用期等于两倍单程传播时延：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">争用期 = 2τ</span><br></pre></td></tr></table></figure><p>其中 τ 是信号从链路一端传播到另一端的时间。</p><h4 id="最小帧长">最小帧长</h4><p>为了保证发送方在发送完成前能够检测到最远端产生的碰撞，需要满足：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">最小帧长 ≥ 数据率 × 2τ</span><br></pre></td></tr></table></figure><p><strong>理解例子</strong>：如果帧太短，发送方可能已经发送完毕，以为发送成功，但远端碰撞信号还没传回来。这样就无法检测碰撞。因此共享式以太网必须规定最小帧长。</p><hr><h3 id="3-4-二进制指数退避算法">3.4 二进制指数退避算法</h3><p>发生第 k 次碰撞后，从区间中随机选择一个整数 r：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">r ∈ [0, 2^k - 1]</span><br></pre></td></tr></table></figure><p>实际以太网中 k 通常取 min(碰撞次数, 10)。等待时间为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">等待时间 = r × 512 bit time</span><br></pre></td></tr></table></figure><p>若连续碰撞达到 16 次，通常放弃发送并向上层报告错误。</p><p><strong>例子</strong>：第 3 次碰撞后，r 可以从 0 到 7 中随机选一个。若 r=5，则等待 5 个争用期单位后再尝试发送。</p><hr><h3 id="3-5-10base-t">3.5 10BASE-T</h3><p>10BASE-T 的含义：</p><table><thead><tr><th>部分</th><th>含义</th></tr></thead><tbody><tr><td>10</td><td>数据率为 10 Mbit/s</td></tr><tr><td>BASE</td><td>基带传输 baseband</td></tr><tr><td>T</td><td>双绞线 twisted pair</td></tr></tbody></table><p>10BASE-T 使用星形拓扑，物理上像星形，但如果中心设备是集线器，逻辑上仍然是共享总线。</p><hr><h3 id="3-6-mac-帧格式">3.6 MAC 帧格式</h3><p>以太网 MAC 帧常见格式如下：</p><table><thead><tr><th>字段</th><th style="text-align:right">长度</th><th>作用</th></tr></thead><tbody><tr><td>目的 MAC 地址</td><td style="text-align:right">6 字节</td><td>接收方硬件地址</td></tr><tr><td>源 MAC 地址</td><td style="text-align:right">6 字节</td><td>发送方硬件地址</td></tr><tr><td>类型字段</td><td style="text-align:right">2 字节</td><td>指出上层协议，如 0x0800 表示 IPv4</td></tr><tr><td>数据字段</td><td style="text-align:right">46 到 1500 字节</td><td>上层交付的数据</td></tr><tr><td>FCS</td><td style="text-align:right">4 字节</td><td>帧检验序列，用于差错检测</td></tr></tbody></table><p><strong>最小 MAC 帧长</strong>：64 字节，不包括前导码和帧开始定界符。若数据字段不足 46 字节，需要填充。</p><hr><h2 id="第四章-网络层">第四章 网络层</h2><h3 id="4-1-ip-地址和-cidr">4.1 IP 地址和 CIDR</h3><p>IPv4 地址为 32 bit，通常写成点分十进制，如：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">192.168.1.10</span><br></pre></td></tr></table></figure><p>CIDR 使用斜线表示网络前缀长度：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">192.168.1.0/24</span><br></pre></td></tr></table></figure><p>其中 /24 表示前 24 bit 是网络前缀，后 8 bit 是主机号。</p><h4 id="地址块大小">地址块大小</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">地址总数 = 2^(32 - 前缀长度)</span><br></pre></td></tr></table></figure><p>例如 /24 有：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^(32-24) = 256 个地址</span><br></pre></td></tr></table></figure><p>通常可分配主机数为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">可用主机数 = 2^主机位数 - 2</span><br></pre></td></tr></table></figure><p>减去的 2 个地址分别是网络地址和广播地址。</p><hr><h3 id="4-2-特殊-ip-地址">4.2 特殊 IP 地址</h3><table><thead><tr><th>地址形式</th><th>含义</th><th>例子</th></tr></thead><tbody><tr><td>主机位全 0</td><td>网络地址</td><td>192.168.1.0/24</td></tr><tr><td>主机位全 1</td><td>广播地址</td><td>192.168.1.255/24</td></tr><tr><td>32 位全 0</td><td>本网络上的本主机</td><td>0.0.0.0</td></tr><tr><td>32 位全 1</td><td>本网络广播</td><td>255.255.255.255</td></tr><tr><td>127.0.0.0/8</td><td>环回地址</td><td>127.0.0.1</td></tr><tr><td>私有地址</td><td>内网使用，不直接在公网路由</td><td>10.0.0.0/8、172.16.0.0/12、192.168.0.0/16</td></tr></tbody></table><hr><h3 id="4-3-arp-与-rarp">4.3 ARP 与 RARP</h3><p>ARP（Address Resolution Protocol）用于根据 IP 地址查找对应的 MAC 地址。</p><p>使用场景：主机或路由器已经知道下一跳 IP 地址，但要在本链路上发送帧，必须知道下一跳的 MAC 地址。</p><p><strong>注意</strong>：ARP 只在同一个局域网或同一条链路上工作。跨网络发送时，ARP 解析的是下一跳路由器的 MAC 地址，而不是最终目的主机的 MAC 地址。</p><p>RARP 是根据 MAC 地址反查 IP 地址，早期用于无盘工作站，现在基本被 DHCP 取代。</p><hr><h3 id="4-4-ip-数据报格式与分片">4.4 IP 数据报格式与分片</h3><p>IP 数据报首部的重要字段：</p><table><thead><tr><th>字段</th><th>作用</th></tr></thead><tbody><tr><td>版本</td><td>IPv4 或 IPv6</td></tr><tr><td>首部长度</td><td>IP 首部长度，单位为 4 字节</td></tr><tr><td>总长度</td><td>首部加数据的总长度</td></tr><tr><td>标识 identification</td><td>同一个原始数据报的所有分片具有相同标识</td></tr><tr><td>标志 flags</td><td>DF 表示不能分片，MF 表示后面还有分片</td></tr><tr><td>片偏移 fragment offset</td><td>当前分片数据在原始数据中的相对位置，单位为 8 字节</td></tr><tr><td>TTL</td><td>生存时间，每经过一个路由器减 1</td></tr><tr><td>协议</td><td>上层协议，如 TCP=6，UDP=17</td></tr><tr><td>首部检验和</td><td>只检验 IP 首部</td></tr><tr><td>源 IP 地址</td><td>发送方 IP</td></tr><tr><td>目的 IP 地址</td><td>接收方 IP</td></tr></tbody></table><h4 id="ip-分片规则">IP 分片规则</h4><ol><li>每个分片都有自己的 IP 首部。</li><li>除最后一个分片外，每个分片的数据部分长度必须是 8 字节的整数倍。</li><li>片偏移字段的单位是 8 字节。</li><li>MF=1 表示后面还有分片，MF=0 表示最后一个分片。</li><li>分片通常只在最终目的主机重组。</li></ol><hr><h3 id="4-5-互联设备的工作层次">4.5 互联设备的工作层次</h3><table><thead><tr><th>设备</th><th>最高工作层次</th><th>是否分隔冲突域</th><th>是否分隔广播域</th></tr></thead><tbody><tr><td>中继器 repeater</td><td>物理层</td><td>否</td><td>否</td></tr><tr><td>集线器 hub</td><td>物理层</td><td>否</td><td>否</td></tr><tr><td>网桥 bridge</td><td>数据链路层</td><td>是</td><td>否</td></tr><tr><td>交换机 switch</td><td>数据链路层</td><td>是</td><td>否，除非划分 VLAN</td></tr><tr><td>路由器 router</td><td>网络层</td><td>是</td><td>是</td></tr><tr><td>网关 gateway</td><td>高层或多层</td><td>视情况而定</td><td>视情况而定</td></tr></tbody></table><p><strong>默认网关</strong>通常是主机所在局域网中通向外部网络的路由器接口地址。</p><hr><h3 id="4-6-路由表与最长前缀匹配">4.6 路由表与最长前缀匹配</h3><p>路由表常见字段：</p><table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody><tr><td>目的网络</td><td>要到达的网络前缀</td></tr><tr><td>子网掩码或前缀长度</td><td>表示网络范围</td></tr><tr><td>下一跳地址</td><td>下一台路由器地址</td></tr><tr><td>出接口</td><td>从哪个接口转发</td></tr><tr><td>度量值 metric</td><td>路由代价</td></tr></tbody></table><p>路由器查表时采用<strong>最长前缀匹配</strong>：若多个路由表项都匹配目的地址，选择前缀最长的一项。</p><p><strong>例子</strong>：目的地址 192.168.1.100 同时匹配 192.168.0.0/16 和 192.168.1.0/24，应选择 /24，因为 /24 更具体。</p><hr><h3 id="4-7-子网划分">4.7 子网划分</h3><p>子网划分的基本步骤：</p><ol><li>根据每个子网需要的主机数确定主机位数。</li><li>主机数公式为 <code>2^h - 2</code>。</li><li>主机位数 h 确定后，前缀长度为 <code>32 - h</code>。</li><li>从大子网到小子网依次分配，避免地址浪费。</li></ol><p><strong>例子</strong>：某子网需要 50 台主机，求前缀长度。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^5 - 2 = 30，不够</span><br><span class="line">2^6 - 2 = 62，够用</span><br><span class="line">主机位 h = 6</span><br><span class="line">前缀长度 = 32 - 6 = /26</span><br></pre></td></tr></table></figure><p>所以需要一个 /26 地址块。</p><hr><h3 id="4-8-rip-协议">4.8 RIP 协议</h3><p>RIP 是距离向量路由协议，使用跳数作为度量值。</p><table><thead><tr><th>项目</th><th>内容</th></tr></thead><tbody><tr><td>协议类型</td><td>内部网关协议 IGP</td></tr><tr><td>算法</td><td>距离向量算法</td></tr><tr><td>运输层</td><td>UDP</td></tr><tr><td>度量值</td><td>跳数</td></tr><tr><td>最大有效跳数</td><td>15</td></tr><tr><td>不可达</td><td>16</td></tr><tr><td>更新方式</td><td>周期性交换路由表</td></tr></tbody></table><p>RIP 更新规则：</p><ol><li>收到相邻路由器 X 的路由表。</li><li>所有距离先加 1，因为要经过 X 才能到达。</li><li>若目的网络原来没有，加入。</li><li>若下一跳原来就是 X，则更新为 X 发来的新距离。</li><li>若下一跳不是 X，但新距离更小，则更新。</li><li>否则保持原表项不变。</li></ol><hr><h3 id="4-9-路由器转发-ip-分组时哪些字段会变化">4.9 路由器转发 IP 分组时哪些字段会变化</h3><p>通常会变化：</p><ol><li><strong>链路层源 MAC 和目的 MAC</strong>：每一跳都重新封装帧。</li><li><strong>TTL</strong>：每经过一个路由器减 1。</li><li><strong>IP 首部检验和</strong>：TTL 变化后必须重新计算。</li><li><strong>分片相关字段</strong>：如果发生分片，总长度、标志、片偏移等会变化。</li></ol><p>通常不变：</p><ol><li>源 IP 地址。</li><li>目的 IP 地址。</li><li>TCP/UDP 端口号。</li></ol><p>例外：如果经过 NAT，源 IP、目的 IP、端口号都可能被修改。</p><hr><h3 id="4-10-vpn-和-nat">4.10 VPN 和 NAT</h3><p>NAT 用于把私有地址转换为公网地址。</p><p>内网访问公网时：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">源地址：私有 IP → 公网 IP</span><br><span class="line">源端口：内部端口 → NAT 映射端口</span><br></pre></td></tr></table></figure><p>公网响应回来时：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">目的地址：公网 IP → 私有 IP</span><br><span class="line">目的端口：NAT 映射端口 → 内部端口</span><br></pre></td></tr></table></figure><p>VPN 是在公共网络上建立逻辑专用通道，使远程用户像在内网一样访问资源。</p><hr><h2 id="第五章-运输层">第五章 运输层</h2><h3 id="5-1-udp-和-tcp-的特点">5.1 UDP 和 TCP 的特点</h3><table><thead><tr><th>项目</th><th>UDP</th><th>TCP</th></tr></thead><tbody><tr><td>连接</td><td>无连接</td><td>面向连接</td></tr><tr><td>数据单位</td><td>面向报文</td><td>面向字节流</td></tr><tr><td>可靠性</td><td>不保证可靠交付</td><td>可靠交付</td></tr><tr><td>顺序</td><td>不保证有序</td><td>保证按序交付</td></tr><tr><td>流量控制</td><td>无</td><td>有</td></tr><tr><td>拥塞控制</td><td>无</td><td>有</td></tr><tr><td>首部长度</td><td>8 字节</td><td>最少 20 字节</td></tr><tr><td>适用场景</td><td>实时、简单、开销低</td><td>可靠传输、文件、网页</td></tr></tbody></table><p><strong>UDP 面向报文</strong>：应用层交给 UDP 一次数据，UDP 就保留这次数据的边界，封装成一个 UDP 用户数据报。</p><p><strong>TCP 面向字节流</strong>：应用层多次写入的数据，在 TCP 看来只是连续字节流，没有固定报文边界。</p><hr><h3 id="5-2-常见应用层协议使用-udp-还是-tcp">5.2 常见应用层协议使用 UDP 还是 TCP</h3><table><thead><tr><th>协议</th><th>通常使用</th><th>原因</th></tr></thead><tbody><tr><td>DNS</td><td>UDP 为主，必要时 TCP</td><td>查询短小，UDP 开销低；区域传送或响应过大用 TCP</td></tr><tr><td>DHCP</td><td>UDP</td><td>客户端初始时可能还没有 IP 地址</td></tr><tr><td>TFTP</td><td>UDP</td><td>简单文件传输，可靠性由应用层处理</td></tr><tr><td>RIP</td><td>UDP</td><td>周期性小报文，简单快速</td></tr><tr><td>SNMP</td><td>UDP</td><td>管理查询短小</td></tr><tr><td>HTTP/HTTPS</td><td>TCP</td><td>需要可靠传输</td></tr><tr><td>FTP</td><td>TCP</td><td>文件传输要求可靠</td></tr><tr><td>SMTP</td><td>TCP</td><td>邮件传输要求可靠</td></tr><tr><td>SSH/Telnet</td><td>TCP</td><td>交互式可靠连接</td></tr><tr><td>BGP</td><td>TCP</td><td>路由信息重要，需要可靠连接</td></tr></tbody></table><hr><h3 id="5-3-tcp-报文段首部重点字段">5.3 TCP 报文段首部重点字段</h3><table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody><tr><td>源端口</td><td>发送进程端口号</td></tr><tr><td>目的端口</td><td>接收进程端口号</td></tr><tr><td>序号 seq</td><td>本报文段数据第一个字节的编号</td></tr><tr><td>确认号 ack</td><td>期望收到对方下一个字节的编号</td></tr><tr><td>首部长度</td><td>TCP 首部长度</td></tr><tr><td>ACK</td><td>确认号字段是否有效</td></tr><tr><td>SYN</td><td>建立连接请求或响应</td></tr><tr><td>FIN</td><td>释放连接</td></tr><tr><td>RST</td><td>复位连接</td></tr><tr><td>窗口 window</td><td>接收方还能接收多少字节</td></tr><tr><td>检验和 checksum</td><td>检验 TCP 首部和数据</td></tr></tbody></table><p><strong>核心理解</strong>：TCP 的序号按字节编号，不是按报文段编号。若某报文段序号为 100，携带 80 字节数据，则下一个报文段序号应为 180。</p><hr><h3 id="5-4-累积确认和捎带确认">5.4 累积确认和捎带确认</h3><p><strong>累积确认</strong>：确认号 n 表示 n 之前的所有字节都已经按序收到，下一步期望收到第 n 个字节。</p><p><strong>捎带确认</strong>：如果双方同时有数据要发，可以把确认信息放在自己发送的数据报文段首部中一起发出，减少单独 ACK 报文。</p><hr><h3 id="5-5-tcp-三次握手">5.5 TCP 三次握手</h3><p>假设客户端初始序号为 x，服务器初始序号为 y。</p><table><thead><tr><th>步骤</th><th>报文</th><th>序号和确认号</th></tr></thead><tbody><tr><td>第一次</td><td>客户端发送 SYN</td><td>seq=x</td></tr><tr><td>第二次</td><td>服务器发送 SYN+ACK</td><td>seq=y，ack=x+1</td></tr><tr><td>第三次</td><td>客户端发送 ACK</td><td>seq=x+1，ack=y+1</td></tr></tbody></table><p><strong>注意</strong>：SYN 会消耗一个序号，即使它不携带普通数据。</p><hr><h3 id="5-6-tcp-四次挥手">5.6 TCP 四次挥手</h3><p>释放连接通常需要四次报文交换，因为 TCP 是全双工通信，两个方向要分别关闭。</p><table><thead><tr><th>步骤</th><th>报文</th><th>含义</th></tr></thead><tbody><tr><td>第一次</td><td>A 发送 FIN</td><td>A 表示自己没有数据要发了</td></tr><tr><td>第二次</td><td>B 发送 ACK</td><td>B 确认收到 A 的 FIN</td></tr><tr><td>第三次</td><td>B 发送 FIN</td><td>B 也没有数据要发了</td></tr><tr><td>第四次</td><td>A 发送 ACK</td><td>A 确认收到 B 的 FIN</td></tr></tbody></table><p><strong>注意</strong>：FIN 也会消耗一个序号。</p><hr><h2 id="第六章-应用层">第六章 应用层</h2><h3 id="6-1-域名和-dns">6.1 域名和 DNS</h3><p>DNS（Domain Name System）用于把域名解析为 IP 地址。</p><p>常见域名服务器：</p><table><thead><tr><th>类型</th><th>作用</th></tr></thead><tbody><tr><td>根域名服务器</td><td>管理顶级域名服务器信息</td></tr><tr><td>顶级域名服务器</td><td>管理 .com、.cn、.org 等</td></tr><tr><td>权限域名服务器</td><td>保存某个区域的权威解析记录</td></tr><tr><td>本地域名服务器</td><td>接收用户查询并代为递归或迭代查询</td></tr></tbody></table><hr><h3 id="6-2-万维网-www">6.2 万维网 WWW</h3><p>万维网基于 URL、HTTP/HTTPS、HTML 等技术。</p><p>浏览器访问网页的大致过程：</p><ol><li>DNS 解析域名得到服务器 IP。</li><li>建立 TCP 连接，HTTPS 还要进行 TLS 握手。</li><li>浏览器发送 HTTP 请求。</li><li>服务器返回 HTTP 响应。</li><li>浏览器解析 HTML、CSS、JavaScript 并显示页面。</li></ol><hr><h3 id="6-3-ftp-和-tftp">6.3 FTP 和 TFTP</h3><table><thead><tr><th>项目</th><th>FTP</th><th>TFTP</th></tr></thead><tbody><tr><td>运输层</td><td>TCP</td><td>UDP</td></tr><tr><td>连接</td><td>有控制连接和数据连接</td><td>无连接</td></tr><tr><td>功能</td><td>完整文件传输、认证、目录操作</td><td>简单文件传输</td></tr><tr><td>可靠性</td><td>由 TCP 保证</td><td>应用层简单确认和重传</td></tr></tbody></table><hr><h1 id="第二部分：参考题原题与解析">第二部分：参考题原题与解析</h1><h2 id="1-17-时延计算">1-17 时延计算</h2><h3 id="原题">原题</h3><p>收发两端之间的传输距离为 1000 km，信号在媒体上的传播速率为 <code>2 × 10^8 m/s</code>。试计算以下两种情况的发送时延和传播时延：</p><ol><li>数据长度为 <code>10^7 bit</code>，数据发送速率为 <code>100 kbit/s</code>。</li><li>数据长度为 <code>10^3 bit</code>，数据发送速率为 <code>1 Gbit/s</code>。</li></ol><p>从以上计算结果可得出什么结论？</p><h3 id="解析">解析</h3><p>公式：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">发送时延 = 数据长度 / 发送速率</span><br><span class="line">传播时延 = 传播距离 / 传播速率</span><br></pre></td></tr></table></figure><p>传播距离：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">1000 km = 1,000,000 m = 10^6 m</span><br></pre></td></tr></table></figure><p>传播时延：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">10^6 / (2 × 10^8) = 5 × 10^-3 s = 5 ms</span><br></pre></td></tr></table></figure><h4 id="情况-1">情况 1</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">发送时延 = 10^7 / (100 × 10^3) = 100 s</span><br><span class="line">传播时延 = 5 ms</span><br></pre></td></tr></table></figure><h4 id="情况-2">情况 2</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">发送时延 = 10^3 / 10^9 = 10^-6 s = 1 μs</span><br><span class="line">传播时延 = 5 ms</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><ol><li>情况 1：发送时延为 100 s，传播时延为 5 ms。</li><li>情况 2：发送时延为 1 μs，传播时延为 5 ms。</li></ol><h3 id="结论">结论</h3><p>发送时延主要由数据长度和发送速率决定；传播时延主要由距离和信号传播速率决定。大文件、低速率时发送时延占主导；小数据、高速率、长距离时传播时延占主导。</p><hr><h2 id="1-18-媒体中正在传播的比特数">1-18 媒体中正在传播的比特数</h2><h3 id="原题">原题</h3><p>假设信号在媒体上的传播速率为 <code>2.3 × 10^8 m/s</code>。媒体长度 l 分别为：</p><ol><li><code>10 cm</code>，网络接口卡。</li><li><code>100 m</code>，局域网。</li><li><code>100 km</code>，城域网。</li><li><code>5000 km</code>，广域网。</li></ol><p>现在连续传送数据，数据率分别为 <code>1 Mbit/s</code> 和 <code>10 Gbit/s</code>。试计算每一种情况下在媒体中的比特数。</p><h3 id="解析">解析</h3><p>媒体中正在传播的比特数，也叫带宽时延积：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">媒体中的比特数 = 数据率 × 传播时延</span><br><span class="line">传播时延 = 媒体长度 / 传播速率</span><br></pre></td></tr></table></figure><h3 id="计算表">计算表</h3><table><thead><tr><th style="text-align:right">媒体长度</th><th style="text-align:right">传播时延</th><th style="text-align:right">1 Mbit/s 时媒体中比特数</th><th style="text-align:right">10 Gbit/s 时媒体中比特数</th></tr></thead><tbody><tr><td style="text-align:right">0.1 m</td><td style="text-align:right">4.35×10^-10 s</td><td style="text-align:right">4.35×10^-4 bit</td><td style="text-align:right">4.35 bit</td></tr><tr><td style="text-align:right">100 m</td><td style="text-align:right">4.35×10^-7 s</td><td style="text-align:right">0.435 bit</td><td style="text-align:right">4348 bit</td></tr><tr><td style="text-align:right">100 km</td><td style="text-align:right">4.35×10^-4 s</td><td style="text-align:right">435 bit</td><td style="text-align:right">4.35×10^6 bit</td></tr><tr><td style="text-align:right">5000 km</td><td style="text-align:right">2.17×10^-2 s</td><td style="text-align:right">2.17×10^4 bit</td><td style="text-align:right">2.17×10^8 bit</td></tr></tbody></table><h3 id="结论">结论</h3><p>链路越长、数据率越高，媒体中同时存在的比特越多。高速长距离链路的带宽时延积很大，TCP 窗口必须足够大，否则无法充分利用链路带宽。</p><hr><h2 id="2-07-奈奎斯特准则计算">2-07 奈奎斯特准则计算</h2><h3 id="原题">原题</h3><p>假定某信道受奈氏准则限制的最高码元速率为 <code>20000 码元/秒</code>。如果采用振幅调制，把码元的振幅划分为 16 个不同等级来传送，那么可以获得多高的数据率？</p><h3 id="解析">解析</h3><p>16 个不同等级表示每个码元可携带：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">log2(16) = 4 bit</span><br></pre></td></tr></table></figure><p>数据率为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">20000 × 4 = 80000 bit/s</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">80000 bit/s = 80 kbit/s</span><br></pre></td></tr></table></figure><hr><h2 id="2-16-cdma-码片序列判断">2-16 CDMA 码片序列判断</h2><h3 id="原题">原题</h3><p>共有四个站进行码分多址 CDMA 通信。四个站的码片序列为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">A: (-1 -1 -1 +1 +1 -1 +1 +1)</span><br><span class="line">B: (-1 -1 +1 -1 +1 +1 +1 -1)</span><br><span class="line">C: (-1 +1 -1 +1 +1 +1 -1 -1)</span><br><span class="line">D: (-1 +1 -1 -1 -1 -1 +1 -1)</span><br></pre></td></tr></table></figure><p>现收到这样的码片序列：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">S = (-1 +1 -3 +1 -1 -3 +1 +1)</span><br></pre></td></tr></table></figure><p>问哪个站发送数据了？发送的数据是 1 还是 0？</p><h3 id="解析">解析</h3><p>用接收序列分别与每个站的码片序列做内积，再除以 8。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">S·A / 8 = 1</span><br><span class="line">S·B / 8 = -1</span><br><span class="line">S·C / 8 = 0</span><br><span class="line">S·D / 8 = 1</span><br></pre></td></tr></table></figure><p>判断规则：</p><ul><li>结果为 <code>+1</code>：发送 bit 1。</li><li>结果为 <code>-1</code>：发送 bit 0。</li><li>结果为 <code>0</code>：未发送。</li></ul><h3 id="答案">答案</h3><p>A 站发送了 1，B 站发送了 0，C 站没有发送，D 站发送了 1。</p><hr><h2 id="3-20-csma-cd-最短帧长">3-20 CSMA/CD 最短帧长</h2><h3 id="原题">原题</h3><p>假定 1 km 长的 CSMA/CD 网络的数据率为 <code>1 Gbit/s</code>。设信号在网络上的传播速率为 <code>200000 km/s</code>。求能够使用此协议的最短帧长。</p><h3 id="解析">解析</h3><p>单程传播时延：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">τ = 1 km / 200000 km/s = 5 × 10^-6 s = 5 μs</span><br></pre></td></tr></table></figure><p>争用期：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2τ = 10 μs = 10 × 10^-6 s</span><br></pre></td></tr></table></figure><p>最短帧长：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">1 × 10^9 bit/s × 10 × 10^-6 s = 10000 bit</span><br></pre></td></tr></table></figure><p>换算为字节：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">10000 / 8 = 1250 字节</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><p>最短帧长为 <code>10000 bit</code>，即 <code>1250 字节</code>。</p><h3 id="易错点">易错点</h3><p>不能只用单程传播时延，必须用两倍传播时延。因为碰撞信号需要从最远端传播回来，发送方才能检测到碰撞。</p><hr><h2 id="4-15-ip-分片在目的主机重组的原因">4-15 IP 分片在目的主机重组的原因</h2><h3 id="原题">原题</h3><p>在互联网中将 IP 数据报分片传送的数据报在最后目的主机进行组装。还可以有另一种做法，即数据报片通过一个网络就进行一次组装。试比较这两种方法的优劣。</p><h3 id="解析">解析</h3><p>方法一：只在最终目的主机重组。</p><p>优点：</p><ol><li>中间路由器负担小，只负责转发，不必缓存所有分片。</li><li>适合互联网中路径复杂、分组可能走不同路径的情况。</li><li>路由器实现简单，转发速度快。</li></ol><p>缺点：</p><ol><li>若一个分片丢失，目的主机收到的其他分片也无法重组成完整数据报。</li><li>目的主机需要缓存分片。</li></ol><p>方法二：每经过一个网络就重组一次。</p><p>优点：</p><ol><li>进入下一个网络前可以恢复完整数据报，逻辑上更直观。</li><li>对后续链路的分片处理可能更清楚。</li></ol><p>缺点：</p><ol><li>路由器必须缓存和重组分片，处理负担大。</li><li>如果分片不按序到达，路由器等待时间增加。</li><li>不利于高速转发。</li></ol><h3 id="答案">答案</h3><p>互联网采用最终目的主机重组更合理，因为它能简化路由器功能，提高转发效率。逐网络重组会显著增加中间路由器的缓存和处理开销，不适合大规模互联网。</p><hr><h2 id="4-17-arp-使用次数">4-17 ARP 使用次数</h2><h3 id="原题">原题</h3><p>主机 A 发送 IP 数据报给主机 B，途中经过了 5 个路由器。试问在 IP 数据报的发送过程中总共使用了几次 ARP？</p><h3 id="解析">解析</h3><p>若途中经过 5 个路由器，则路径为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">A → R1 → R2 → R3 → R4 → R5 → B</span><br></pre></td></tr></table></figure><p>共有 6 段链路：</p><ol><li>A 到 R1。</li><li>R1 到 R2。</li><li>R2 到 R3。</li><li>R3 到 R4。</li><li>R4 到 R5。</li><li>R5 到 B。</li></ol><p>每一段链路都需要知道下一跳的 MAC 地址。如果 ARP 缓存中没有对应表项，每段链路需要一次 ARP。</p><h3 id="答案">答案</h3><p>在没有 ARP 缓存的情况下，共需要使用 <code>6 次 ARP</code>。</p><h3 id="易错点">易错点</h3><p>ARP 不是一次解析最终目的主机 B 的 MAC 地址。每一跳都只解析本链路上的下一跳 MAC 地址。</p><hr><h2 id="4-18-路由表查找">4-18 路由表查找</h2><h3 id="原题">原题</h3><p>设某路由器建立了如下转发表：</p><table><thead><tr><th>前缀匹配</th><th>下一跳</th></tr></thead><tbody><tr><td>192.4.153.0/26</td><td>R3</td></tr><tr><td>128.96.39.0/25</td><td>接口 m0</td></tr><tr><td>128.96.39.128/25</td><td>接口 m1</td></tr><tr><td>128.96.40.0/25</td><td>R2</td></tr><tr><td>默认</td><td>R4</td></tr></tbody></table><p>现共收到 5 个分组，其目的地址分别为：</p><ol><li>128.96.39.10</li><li>128.96.40.12</li><li>128.96.40.151</li><li>192.4.153.17</li><li>192.4.153.90</li></ol><p>试说明每个分组应如何转发。</p><h3 id="解析与答案">解析与答案</h3><table><thead><tr><th>目的地址</th><th>匹配过程</th><th>转发结果</th></tr></thead><tbody><tr><td>128.96.39.10</td><td>属于 128.96.39.0 到 128.96.39.127</td><td>接口 m0</td></tr><tr><td>128.96.40.12</td><td>属于 128.96.40.0 到 128.96.40.127</td><td>R2</td></tr><tr><td>128.96.40.151</td><td>不属于 128.96.40.0/25，走默认路由</td><td>R4</td></tr><tr><td>192.4.153.17</td><td>属于 192.4.153.0 到 192.4.153.63</td><td>R3</td></tr><tr><td>192.4.153.90</td><td>不属于 192.4.153.0/26，走默认路由</td><td>R4</td></tr></tbody></table><h3 id="易错点">易错点</h3><p><code>/25</code> 的地址块大小是 128 个地址；<code>/26</code> 的地址块大小是 64 个地址。判断范围时要先算出地址块边界。</p><hr><h2 id="4-19-地址块分配">4-19 地址块分配</h2><h3 id="原题">原题</h3><p>试为计算机下一跳。某单位有 4000 台计算机，平均分布在 16 个不同地点。该单位分配到一个地址块 <code>129.250/16</code>。每一个地点分配一个连续的地址块，并算出每个地址块中 IP 地址的最小值和最大值。</p><h3 id="解析">解析</h3><p>每个地点平均主机数：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">4000 / 16 = 250 台</span><br></pre></td></tr></table></figure><p>需要满足：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^h - 2 ≥ 250</span><br></pre></td></tr></table></figure><p>当 h=8 时：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^8 - 2 = 254</span><br></pre></td></tr></table></figure><p>所以每个地点需要 8 位主机位，即 <code>/24</code> 地址块。</p><p><code>129.250.0.0/16</code> 可以划分出许多 <code>/24</code>，给 16 个地点分配前 16 个即可。</p><h3 id="一种可行分配">一种可行分配</h3><table><thead><tr><th style="text-align:right">地点</th><th>地址块</th><th>可用最小地址</th><th>可用最大地址</th><th>广播地址</th></tr></thead><tbody><tr><td style="text-align:right">1</td><td>129.250.0.0/24</td><td>129.250.0.1</td><td>129.250.0.254</td><td>129.250.0.255</td></tr><tr><td style="text-align:right">2</td><td>129.250.1.0/24</td><td>129.250.1.1</td><td>129.250.1.254</td><td>129.250.1.255</td></tr><tr><td style="text-align:right">3</td><td>129.250.2.0/24</td><td>129.250.2.1</td><td>129.250.2.254</td><td>129.250.2.255</td></tr><tr><td style="text-align:right">…</td><td>…</td><td>…</td><td>…</td><td>…</td></tr><tr><td style="text-align:right">16</td><td>129.250.15.0/24</td><td>129.250.15.1</td><td>129.250.15.254</td><td>129.250.15.255</td></tr></tbody></table><h3 id="答案">答案</h3><p>每个地点可分配一个 <code>/24</code> 地址块，每个地址块可用主机地址为 254 个，能够满足 250 台主机需求。</p><hr><h2 id="4-20-ip-数据报分片">4-20 IP 数据报分片</h2><h3 id="原题">原题</h3><p>一个数据报长度为 <code>4000 字节</code>，固定首部长度为 <code>20 字节</code>。现在经过一个网络传送，但此网络能够传送的最大数据长度为 <code>1500 字节</code>。试问应当划分为几个短些的数据报片？各数据报片的数据字段长度、片偏移字段和 MF 标志应为何值？</p><h3 id="解析">解析</h3><p>原始数据报总长度为 4000 字节，首部为 20 字节，所以数据部分为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">4000 - 20 = 3980 字节</span><br></pre></td></tr></table></figure><p>每个分片总长度最多为 1500 字节，每个分片都有 20 字节首部，所以每个分片最多可携带数据：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">1500 - 20 = 1480 字节</span><br></pre></td></tr></table></figure><p>1480 是 8 的整数倍，可以作为非最后分片的数据长度。</p><p>分片方案：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">3980 = 1480 + 1480 + 1020</span><br></pre></td></tr></table></figure><p>片偏移单位为 8 字节：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">第 1 片偏移 = 0 / 8 = 0</span><br><span class="line">第 2 片偏移 = 1480 / 8 = 185</span><br><span class="line">第 3 片偏移 = (1480 + 1480) / 8 = 370</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><table><thead><tr><th style="text-align:right">分片</th><th style="text-align:right">数据字段长度</th><th style="text-align:right">总长度</th><th style="text-align:right">片偏移</th><th style="text-align:right">MF</th></tr></thead><tbody><tr><td style="text-align:right">第 1 片</td><td style="text-align:right">1480 字节</td><td style="text-align:right">1500 字节</td><td style="text-align:right">0</td><td style="text-align:right">1</td></tr><tr><td style="text-align:right">第 2 片</td><td style="text-align:right">1480 字节</td><td style="text-align:right">1500 字节</td><td style="text-align:right">185</td><td style="text-align:right">1</td></tr><tr><td style="text-align:right">第 3 片</td><td style="text-align:right">1020 字节</td><td style="text-align:right">1040 字节</td><td style="text-align:right">370</td><td style="text-align:right">0</td></tr></tbody></table><h3 id="易错点">易错点</h3><p>片偏移不是字节数本身，而是以 8 字节为单位。非最后分片的数据部分长度必须是 8 字节的整数倍。</p><hr><h2 id="4-22-cidr-地址块聚合">4-22 CIDR 地址块聚合</h2><h3 id="原题">原题</h3><p>有如下四个 <code>/24</code> 地址块，试进行最大可能的聚合。</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">212.56.132.0/24</span><br><span class="line">212.56.133.0/24</span><br><span class="line">212.56.134.0/24</span><br><span class="line">212.56.135.0/24</span><br></pre></td></tr></table></figure><h3 id="解析">解析</h3><p>这四个地址块连续，第三个字节分别是：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">132, 133, 134, 135</span><br></pre></td></tr></table></figure><p>4 个连续 <code>/24</code> 可以聚合为一个 <code>/22</code>，因为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">4 × 256 = 1024 = 2^(32-22)</span><br></pre></td></tr></table></figure><p>起始地址为 212.56.132.0，且 132 能被 4 整除，满足 /22 边界。</p><h3 id="答案">答案</h3><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">212.56.132.0/22</span><br></pre></td></tr></table></figure><p>地址范围为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">212.56.132.0 到 212.56.135.255</span><br></pre></td></tr></table></figure><hr><h2 id="4-26-vlsm-不等长子网划分">4-26 VLSM 不等长子网划分</h2><h3 id="原题">原题</h3><p>一个大公司有一个总部和三个下属部门。公司分配到的网络前缀是 <code>192.77.33/24</code>。网络布局图中，总部共有 5 个局域网，其中 LAN1 到 LAN4 都连接到路由器 R1，R1 再通过 LAN5 与路由器 R2 相连。R2 和三个部门的局域网 LAN6 到 LAN8 通过广域网 WAN1 到 WAN3 相连。每一个局域网旁标明的数字是局域网上的主机数。试给每一个局域网分配一个合适的网络前缀。</p><p>图中主机数：</p><table><thead><tr><th>网络</th><th style="text-align:right">主机数</th></tr></thead><tbody><tr><td>LAN1</td><td style="text-align:right">50</td></tr><tr><td>LAN2</td><td style="text-align:right">10</td></tr><tr><td>LAN3</td><td style="text-align:right">28</td></tr><tr><td>LAN4</td><td style="text-align:right">10</td></tr><tr><td>LAN5</td><td style="text-align:right">4</td></tr><tr><td>LAN6</td><td style="text-align:right">20</td></tr><tr><td>LAN7</td><td style="text-align:right">20</td></tr><tr><td>LAN8</td><td style="text-align:right">25</td></tr><tr><td>WAN1</td><td style="text-align:right">2</td></tr><tr><td>WAN2</td><td style="text-align:right">2</td></tr><tr><td>WAN3</td><td style="text-align:right">2</td></tr></tbody></table><h3 id="解析">解析</h3><p>先按主机数从大到小排序，再分配地址块。</p><table><thead><tr><th style="text-align:right">需要主机数</th><th style="text-align:right">所需地址数</th><th style="text-align:right">前缀</th></tr></thead><tbody><tr><td style="text-align:right">50</td><td style="text-align:right">至少 64</td><td style="text-align:right">/26</td></tr><tr><td style="text-align:right">28、25、20、20</td><td style="text-align:right">至少 32</td><td style="text-align:right">/27</td></tr><tr><td style="text-align:right">10、10</td><td style="text-align:right">至少 16</td><td style="text-align:right">/28</td></tr><tr><td style="text-align:right">4</td><td style="text-align:right">至少 8</td><td style="text-align:right">/29</td></tr><tr><td style="text-align:right">2</td><td style="text-align:right">至少 4</td><td style="text-align:right">/30</td></tr></tbody></table><h3 id="一种可行分配">一种可行分配</h3><table><thead><tr><th>网络</th><th style="text-align:right">主机数</th><th>分配前缀</th><th>可用主机范围</th></tr></thead><tbody><tr><td>LAN1</td><td style="text-align:right">50</td><td>192.77.33.0/26</td><td>192.77.33.1 到 192.77.33.62</td></tr><tr><td>LAN3</td><td style="text-align:right">28</td><td>192.77.33.64/27</td><td>192.77.33.65 到 192.77.33.94</td></tr><tr><td>LAN8</td><td style="text-align:right">25</td><td>192.77.33.96/27</td><td>192.77.33.97 到 192.77.33.126</td></tr><tr><td>LAN6</td><td style="text-align:right">20</td><td>192.77.33.128/27</td><td>192.77.33.129 到 192.77.33.158</td></tr><tr><td>LAN7</td><td style="text-align:right">20</td><td>192.77.33.160/27</td><td>192.77.33.161 到 192.77.33.190</td></tr><tr><td>LAN2</td><td style="text-align:right">10</td><td>192.77.33.192/28</td><td>192.77.33.193 到 192.77.33.206</td></tr><tr><td>LAN4</td><td style="text-align:right">10</td><td>192.77.33.208/28</td><td>192.77.33.209 到 192.77.33.222</td></tr><tr><td>LAN5</td><td style="text-align:right">4</td><td>192.77.33.224/29</td><td>192.77.33.225 到 192.77.33.230</td></tr><tr><td>WAN1</td><td style="text-align:right">2</td><td>192.77.33.232/30</td><td>192.77.33.233 到 192.77.33.234</td></tr><tr><td>WAN2</td><td style="text-align:right">2</td><td>192.77.33.236/30</td><td>192.77.33.237 到 192.77.33.238</td></tr><tr><td>WAN3</td><td style="text-align:right">2</td><td>192.77.33.240/30</td><td>192.77.33.241 到 192.77.33.242</td></tr></tbody></table><h3 id="答案说明">答案说明</h3><p>这不是唯一答案。只要满足每个子网主机数要求、地址块不重叠、全部落在 <code>192.77.33.0/24</code> 内，就是合理分配。</p><hr><h2 id="4-31-cidr-地址块范围">4-31 CIDR 地址块范围</h2><h3 id="原题">原题</h3><p>已知地址块中的一个地址是 <code>140.120.84.24/20</code>。试求这个地址块中的最小地址和最大地址。地址掩码是什么？地址块中共有多少个地址？相当于多少个 C 类地址？</p><h3 id="解析">解析</h3><p><code>/20</code> 表示前 20 bit 为网络前缀。</p><p>子网掩码为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">255.255.240.0</span><br></pre></td></tr></table></figure><p>第三个字节的块大小：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">256 - 240 = 16</span><br></pre></td></tr></table></figure><p>第三个字节为 84，属于：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">80 到 95</span><br></pre></td></tr></table></figure><p>所以地址块范围是：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">140.120.80.0 到 140.120.95.255</span><br></pre></td></tr></table></figure><p>地址总数：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^(32-20) = 4096</span><br></pre></td></tr></table></figure><p>一个 C 类 <code>/24</code> 地址块有 256 个地址：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">4096 / 256 = 16</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><table><thead><tr><th>项目</th><th>答案</th></tr></thead><tbody><tr><td>最小地址</td><td>140.120.80.0</td></tr><tr><td>最大地址</td><td>140.120.95.255</td></tr><tr><td>地址掩码</td><td>255.255.240.0</td></tr><tr><td>地址总数</td><td>4096 个</td></tr><tr><td>相当于 C 类地址数</td><td>16 个 C 类地址块</td></tr></tbody></table><hr><h2 id="4-33-等长子网划分">4-33 等长子网划分</h2><h3 id="原题">原题</h3><p>某单位分配到一个地址块 <code>136.23.12.64/26</code>。现在需要进一步划分为 4 个一样大的子网。试问：</p><ol><li>每个子网的网络前缀有多长？</li><li>每一个子网中有多少个地址？</li><li>每一个子网的地址块是什么？</li><li>每一个子网可分配给主机使用的最小地址和最大地址是什么？</li></ol><h3 id="解析">解析</h3><p>原地址块是 <code>/26</code>，共有：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^(32-26) = 64 个地址</span><br></pre></td></tr></table></figure><p>要划分为 4 个一样大的子网，需要再借 2 bit：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^2 = 4</span><br></pre></td></tr></table></figure><p>新前缀为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">/26 + 2 = /28</span><br></pre></td></tr></table></figure><p>每个 <code>/28</code> 子网有：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">2^(32-28) = 16 个地址</span><br></pre></td></tr></table></figure><p>可用主机地址为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">16 - 2 = 14 个</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><table><thead><tr><th style="text-align:right">子网</th><th>地址块</th><th>可用最小地址</th><th>可用最大地址</th><th>广播地址</th></tr></thead><tbody><tr><td style="text-align:right">1</td><td>136.23.12.64/28</td><td>136.23.12.65</td><td>136.23.12.78</td><td>136.23.12.79</td></tr><tr><td style="text-align:right">2</td><td>136.23.12.80/28</td><td>136.23.12.81</td><td>136.23.12.94</td><td>136.23.12.95</td></tr><tr><td style="text-align:right">3</td><td>136.23.12.96/28</td><td>136.23.12.97</td><td>136.23.12.110</td><td>136.23.12.111</td></tr><tr><td style="text-align:right">4</td><td>136.23.12.112/28</td><td>136.23.12.113</td><td>136.23.12.126</td><td>136.23.12.127</td></tr></tbody></table><hr><h2 id="4-37-rip-路由表更新">4-37 RIP 路由表更新</h2><h3 id="原题">原题</h3><p>假定网络中的路由器 B 的路由表有如下项目，这三列分别表示“目的网络”“距离”和“下一跳路由器”：</p><table><thead><tr><th>目的网络</th><th style="text-align:right">距离</th><th>下一跳</th></tr></thead><tbody><tr><td>N1</td><td style="text-align:right">7</td><td>A</td></tr><tr><td>N2</td><td style="text-align:right">2</td><td>C</td></tr><tr><td>N6</td><td style="text-align:right">8</td><td>F</td></tr><tr><td>N8</td><td style="text-align:right">4</td><td>E</td></tr><tr><td>N9</td><td style="text-align:right">4</td><td>F</td></tr></tbody></table><p>现在 B 收到从 C 发来的路由信息，这两列分别表示“目的网络”和“距离”：</p><table><thead><tr><th>目的网络</th><th style="text-align:right">距离</th></tr></thead><tbody><tr><td>N2</td><td style="text-align:right">4</td></tr><tr><td>N3</td><td style="text-align:right">8</td></tr><tr><td>N6</td><td style="text-align:right">4</td></tr><tr><td>N8</td><td style="text-align:right">3</td></tr><tr><td>N9</td><td style="text-align:right">5</td></tr></tbody></table><p>试求出路由器 B 更新后的路由表，并说明每一步。</p><h3 id="解析">解析</h3><p>B 收到 C 的信息后，先把所有距离加 1，因为从 B 到这些网络要先经过 C。</p><table><thead><tr><th>目的网络</th><th style="text-align:right">C 发来的距离</th><th style="text-align:right">B 经 C 的新距离</th></tr></thead><tbody><tr><td>N2</td><td style="text-align:right">4</td><td style="text-align:right">5</td></tr><tr><td>N3</td><td style="text-align:right">8</td><td style="text-align:right">9</td></tr><tr><td>N6</td><td style="text-align:right">4</td><td style="text-align:right">5</td></tr><tr><td>N8</td><td style="text-align:right">3</td><td style="text-align:right">4</td></tr><tr><td>N9</td><td style="text-align:right">5</td><td style="text-align:right">6</td></tr></tbody></table><p>逐项更新：</p><ol><li>N1：C 没提供，保持原来 <code>7, A</code>。</li><li>N2：原下一跳就是 C，所以更新为 <code>5, C</code>。</li><li>N3：原表没有，加入 <code>9, C</code>。</li><li>N6：原来是 <code>8, F</code>，现在经 C 为 5，更短，更新为 <code>5, C</code>。</li><li>N8：原来是 <code>4, E</code>，现在经 C 也是 4，不更短，保持 <code>4, E</code>。</li><li>N9：原来是 <code>4, F</code>，现在经 C 为 6，更差，保持 <code>4, F</code>。</li></ol><h3 id="答案">答案</h3><table><thead><tr><th>目的网络</th><th style="text-align:right">距离</th><th>下一跳</th></tr></thead><tbody><tr><td>N1</td><td style="text-align:right">7</td><td>A</td></tr><tr><td>N2</td><td style="text-align:right">5</td><td>C</td></tr><tr><td>N3</td><td style="text-align:right">9</td><td>C</td></tr><tr><td>N6</td><td style="text-align:right">5</td><td>C</td></tr><tr><td>N8</td><td style="text-align:right">4</td><td>E</td></tr><tr><td>N9</td><td style="text-align:right">4</td><td>F</td></tr></tbody></table><h3 id="易错点">易错点</h3><p>如果原来的下一跳就是发来更新的路由器 C，即使距离变大，也要更新。因为这代表经 C 到达该网络的最新信息。</p><hr><h2 id="5-08-udp-面向报文-tcp-面向字节流">5-08 UDP 面向报文，TCP 面向字节流</h2><h3 id="原题">原题</h3><p>为什么说 UDP 是面向报文的，而 TCP 是面向字节流的？</p><h3 id="解析">解析</h3><p>UDP 保留应用层交付数据的边界。应用层一次交给 UDP 一个报文，UDP 就添加首部后形成一个 UDP 用户数据报。接收方 UDP 也按一个完整用户数据报交付给应用层。</p><p>TCP 不保留应用层写入数据的边界。应用层多次写入的数据，在 TCP 看来只是连续的字节流。TCP 可以把应用层一次写入的数据拆开发送，也可以把多次写入的数据合并发送。</p><h3 id="答案">答案</h3><p>UDP 面向报文，是因为 UDP 对应用层交下来的每个报文都分别封装并交付，保留报文边界；TCP 面向字节流，是因为 TCP 把应用层数据看成无结构的连续字节序列，不保留应用层写入边界。</p><h3 id="举例">举例</h3><p>应用层连续调用两次发送：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">send(&quot;hello&quot;)</span><br><span class="line">send(&quot;world&quot;)</span><br></pre></td></tr></table></figure><p>UDP 接收方通常看到两个报文：<code>hello</code> 和 <code>world</code>。</p><p>TCP 接收方可能一次读到 <code>helloworld</code>，也可能分几次读到 <code>hel</code>、<code>lowor</code>、<code>ld</code>，边界由 TCP 缓冲和应用读取方式决定。</p><hr><h2 id="5-23-tcp-序号与确认号">5-23 TCP 序号与确认号</h2><h3 id="原题">原题</h3><p>主机 A 向主机 B 连续发送了两个 TCP 报文段，其序号分别是 70 和 100。试问：</p><ol><li>第一个报文段携带了多少字节的数据？</li><li>主机 B 收到第一个报文段后发回的确认中的确认号应当是多少？</li><li>如果 B 收到第二个报文段后发回的确认号是 180，试问 A 发送的第二个报文段中的数据有多少字节？</li><li>如果 A 发送的第一个报文段丢失了，但第二个报文段到达了 B。B 在第二个报文段到达后向 A 发送确认。这个确认号应为多少？</li></ol><h3 id="解析">解析</h3><p>TCP 序号表示本报文段数据第一个字节的编号。</p><p>第一个报文段序号为 70，第二个报文段序号为 100，说明第一个报文段覆盖字节：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">70 到 99</span><br></pre></td></tr></table></figure><p>所以第一个报文段数据长度为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">100 - 70 = 30 字节</span><br></pre></td></tr></table></figure><p>收到第一个报文段后，B 期望下一个字节是 100，因此确认号为 100。</p><p>如果 B 收到第二个报文段后确认号为 180，说明已经按序收到 179 号字节，下一步期望 180。第二个报文段从 100 开始，所以长度为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">180 - 100 = 80 字节</span><br></pre></td></tr></table></figure><p>如果第一个报文段丢失，第二个报文段虽然到了，但 B 仍然缺少从 70 开始的数据，因此累积确认号仍为 70。</p><h3 id="答案">答案</h3><ol><li>第一个报文段携带 <code>30 字节</code> 数据。</li><li>收到第一个报文段后确认号为 <code>100</code>。</li><li>第二个报文段携带 <code>80 字节</code> 数据。</li><li>若第一个报文段丢失而第二个到达，确认号应为 <code>70</code>。</li></ol><hr><h2 id="5-30-tcp-最大吞吐量">5-30 TCP 最大吞吐量</h2><h3 id="原题">原题</h3><p>设 TCP 使用的最大窗口为 <code>65535 字节</code>，而传输信道不产生差错，带宽也不受限制。若报文段的平均往返时间为 <code>20 ms</code>，问所能得到的最大吞吐量是多少？</p><h3 id="解析">解析</h3><p>吞吐量受窗口和 RTT 限制：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">最大吞吐量 = 窗口大小 / RTT</span><br></pre></td></tr></table></figure><p>代入：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">65535 字节 / 0.02 s = 3276750 字节/s</span><br></pre></td></tr></table></figure><p>换算为 bit/s：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">3276750 × 8 = 26214000 bit/s</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">最大吞吐量 = 26.214 Mbit/s</span><br></pre></td></tr></table></figure><p>约为 <code>26.2 Mbit/s</code>。</p><hr><h2 id="5-31-tcp-窗口与链路利用率">5-31 TCP 窗口与链路利用率</h2><h3 id="原题">原题</h3><p>通信信道带宽为 <code>1 Gbit/s</code>，端到端传播时延为 <code>10 ms</code>，TCP 的发送窗口为 <code>65535 字节</code>。试问：可能达到的最大吞吐量是多少？信道利用率是多少？</p><h3 id="解析">解析</h3><p>通常“端到端传播时延”理解为单程传播时延，因此：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">RTT ≈ 2 × 10 ms = 20 ms</span><br></pre></td></tr></table></figure><p>最大吞吐量：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">65535 字节 / 0.02 s = 3276750 字节/s</span><br><span class="line">3276750 × 8 = 26214000 bit/s</span><br></pre></td></tr></table></figure><p>即：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">26.214 Mbit/s</span><br></pre></td></tr></table></figure><p>信道利用率：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">26.214 Mbit/s / 1000 Mbit/s = 0.026214 = 2.6214%</span><br></pre></td></tr></table></figure><h3 id="答案">答案</h3><p>按单程传播时延 10 ms 理解：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">最大吞吐量约为 26.2 Mbit/s</span><br><span class="line">信道利用率约为 2.62%</span><br></pre></td></tr></table></figure><h3 id="补充说明">补充说明</h3><p>如果题目或老师明确把 10 ms 当作 RTT，则最大吞吐量为约 <code>52.4 Mbit/s</code>，利用率约 <code>5.24%</code>。但教材题中“传播时延”通常指单程时延，因此优先按 RTT=20 ms 计算。</p><hr><h2 id="5-65-tcp-报文段中的确认字段">5-65 TCP 报文段中的确认字段</h2><h3 id="原题">原题</h3><p>假定主机 A 向主机 B 发送一个 TCP 报文段。在这个报文段中，序号是 50，而数据一共有 6 字节长。试问，在这个报文中的确认字段是否应当写入 56？</p><h3 id="解析">解析</h3><p>TCP 序号和确认号的方向不同。</p><ul><li>序号 50 表示 A 发送给 B 的数据从第 50 号字节开始。</li><li>数据长度为 6 字节，说明 A 发出的数据覆盖 50 到 55。</li><li>B 收到后，如果要确认 A 的数据，B 发回的确认号应为 56。</li></ul><p>但是题目问的是 A 发给 B 的这个报文段中的确认字段是否应写入 56。A 报文段中的确认号用于确认 B 发给 A 的数据，而不是确认 A 自己发出的数据。</p><h3 id="答案">答案</h3><p>不一定，也通常不应根据这个报文段自身的序号和长度写 56。<code>56</code> 应该出现在 B 返回给 A 的确认号中，表示 B 已收到 A 发来的 50 到 55 号字节，下一步期望收到 56 号字节。A 发给 B 的报文段中的确认号取决于 A 已收到 B 的哪些数据。</p><hr><h2 id="5-66-tcp-序号是否按报文段编号">5-66 TCP 序号是否按报文段编号</h2><h3 id="原题">原题</h3><p>主机 A 通过 TCP 连接向主机 B 发送一个很长的文件，因此需要分成很多个报文段来发送。假定某一个 TCP 报文段的序号是 x，那么下一个报文段的序号是否就是 x+1？TCP 的吞吐量应当是每秒发送的数据字节数，还是每秒发送的首部和数据之和的字节数？</p><h3 id="解析">解析</h3><p>TCP 的序号按字节编号，不按报文段编号。</p><p>如果某报文段序号为 x，携带 n 字节数据，那么下一个报文段序号应为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">x + n</span><br></pre></td></tr></table></figure><p>只有当该报文段只携带 1 字节数据时，下一个序号才是 x+1。</p><p>关于吞吐量，要看统计口径：</p><ol><li>若讨论应用层文件传输效率，通常看每秒成功传输的有效数据字节数。</li><li>若讨论链路占用或网络负载，则可能统计 TCP 首部、IP 首部、链路层首部等开销。</li></ol><h3 id="答案">答案</h3><p>下一个 TCP 报文段的序号不一定是 x+1，而应是 <code>x + 本报文段携带的数据字节数</code>。TCP 传送文件时通常关注有效数据吞吐量，即每秒成功传输的文件数据字节数；若计算链路利用或协议开销，则需要把首部也计入传输总量。</p><hr><h1 id="第三部分：考前速记清单">第三部分：考前速记清单</h1><h2 id="1-必背公式">1. 必背公式</h2><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">发送时延 = 数据长度 / 发送速率</span><br><span class="line">传播时延 = 距离 / 传播速率</span><br><span class="line">媒体中比特数 = 数据率 × 传播时延</span><br><span class="line">数据率 = 波特率 × log2(电平数)</span><br><span class="line">奈奎斯特：最高数据率 = 2W log2(V)</span><br><span class="line">香农：C = W log2(1 + S/N)</span><br><span class="line">CSMA/CD 最小帧长 = 数据率 × 2τ</span><br><span class="line">地址块地址数 = 2^(32 - 前缀长度)</span><br><span class="line">可用主机数 = 2^主机位数 - 2</span><br><span class="line">TCP 最大吞吐量 = 窗口大小 / RTT</span><br></pre></td></tr></table></figure><h2 id="2-必背协议特点">2. 必背协议特点</h2><table><thead><tr><th>协议</th><th>重点</th></tr></thead><tbody><tr><td>ARP</td><td>IP 地址解析为 MAC 地址，只解析下一跳</td></tr><tr><td>IP</td><td>尽力而为，无连接，不可靠</td></tr><tr><td>ICMP</td><td>差错报告和网络探测</td></tr><tr><td>RIP</td><td>距离向量，UDP，最大 15 跳，16 不可达</td></tr><tr><td>OSPF</td><td>链路状态，直接用 IP</td></tr><tr><td>BGP</td><td>外部网关协议，TCP</td></tr><tr><td>UDP</td><td>无连接，面向报文，首部 8 字节</td></tr><tr><td>TCP</td><td>面向连接，可靠，面向字节流，首部至少 20 字节</td></tr><tr><td>DNS</td><td>UDP 为主，必要时 TCP</td></tr><tr><td>FTP</td><td>TCP，有控制连接和数据连接</td></tr><tr><td>TFTP</td><td>UDP，简单文件传输</td></tr></tbody></table><h2 id="3-最常考易错点">3. 最常考易错点</h2><ol><li>TCP 序号按字节编号，不按报文段编号。</li><li>TCP 确认号表示期望收到的下一个字节编号。</li><li>SYN 和 FIN 都消耗一个序号。</li><li>IP 片偏移单位是 8 字节，不是 1 字节。</li><li>除最后一个 IP 分片外，数据部分长度必须是 8 字节整数倍。</li><li>路由器转发时通常会改变 MAC 地址、TTL 和 IP 首部检验和。</li><li>没有 NAT 时，源 IP 和目的 IP 在转发过程中通常不变。</li><li>ARP 解析的是下一跳 MAC，不一定是最终目的主机 MAC。</li><li>CIDR 查路由表时用最长前缀匹配。</li><li>子网划分优先从大子网开始分配，避免碎片化。</li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;computer-network-期末中文复习资料详细版&quot;&gt;Computer Network</summary>
        
      
    
    
    
    <category term="笔记" scheme="https://college-github-io.pages.dev/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="学校" scheme="https://college-github-io.pages.dev/tags/%E5%AD%A6%E6%A0%A1/"/>
    
    <category term="笔记" scheme="https://college-github-io.pages.dev/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Computer Network" scheme="https://college-github-io.pages.dev/tags/Computer-Network/"/>
    
  </entry>
  
  <entry>
    <title>一个中文乱码检测修复工具 AI Text Encoding Guard</title>
    <link href="https://college-github-io.pages.dev/posts/a1b2c3d4/"/>
    <id>https://college-github-io.pages.dev/posts/a1b2c3d4/</id>
    <published>2026-05-21T02:10:00.000Z</published>
    <updated>2026-05-21T02:27:05.985Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一个中文乱码检测修复工具-ai-text-encoding-guard">一个中文乱码检测修复工具 AI Text Encoding Guard</h1><p>最近整理了一个开源项目，叫 <strong>AI Text Encoding Guard</strong>。<br>事情的起因很具体：用 Claude Code 改含中文的文件，改完一看，中文全变乱码了。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">修复前（乱码）                  修复后（正常）</span><br><span class="line">─────────────────────           ─────────────────────</span><br><span class="line">// 鐢ㄦ埛鐧诲綍鎴愬姛             // 用户登录成功</span><br><span class="line">// 鏁版嵁搴撹繛鎺ュけ璐�           // 数据库连接失败</span><br><span class="line">// 璁㈠崟鍒涘缓鎴愬姛              // 订单创建成功</span><br></pre></td></tr></table></figure><p>这不是个例。Claude、Cursor、Copilot、Codex 都会中招。根源是 UTF-8 字节被误读为 GBK，等你发现的时候用户已经看到乱码了。</p><h2 id="它做的事">它做的事</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">扫描文件 → 七种乱码模式打分 → 可疑文件标记 → 一键修复（带备份）</span><br></pre></td></tr></table></figure><p>核心流程：</p><ol><li>扫描项目目录，默认覆盖 20 种常见文件扩展名</li><li>七种检测维度逐行分析，每种有独立权重</li><li>文件总分 &gt; 0 标记为可疑，分数越高越严重</li><li><code>--fix-gbk</code> 自动修复，三重安全门防止误修复</li><li>修复前自动创建 <code>.bak.mojibake</code> 备份</li></ol><h2 id="七种检测维度">七种检测维度</h2><table><thead><tr><th style="text-align:left">乱码类型</th><th style="text-align:left">产生原因</th><th style="text-align:left">检测信号</th><th style="text-align:center">权重</th></tr></thead><tbody><tr><td style="text-align:left">口字码</td><td style="text-align:left">UTF-8 读 GBK</td><td style="text-align:left">Unicode 替换字符 <code>�</code></td><td style="text-align:center">+12</td></tr><tr><td style="text-align:left">破标签</td><td style="text-align:left">AI 编辑吞尖括号</td><td style="text-align:left">损坏的 HTML 闭合标签</td><td style="text-align:center">+10</td></tr><tr><td style="text-align:left">古文码</td><td style="text-align:left">GBK 读 UTF-8</td><td style="text-align:left">18 个已知乱码码点</td><td style="text-align:center">+2</td></tr><tr><td style="text-align:left">锟拷码</td><td style="text-align:left">UTF-8→GBK→UTF-8 双重转换</td><td style="text-align:left"><code>锟斤拷</code> 模式匹配</td><td style="text-align:center">+8</td></tr><tr><td style="text-align:left">烫屯码</td><td style="text-align:left">VC 调试未初始化内存</td><td style="text-align:left"><code>烫烫烫</code> / <code>屯屯屯</code> 重复</td><td style="text-align:center">+6</td></tr><tr><td style="text-align:left">问句码</td><td style="text-align:left">双重转换</td><td style="text-align:left">中文后连续 <code>??</code></td><td style="text-align:center">+8</td></tr><tr><td style="text-align:left">符号码</td><td style="text-align:left">ISO8859-1 读 UTF-8</td><td style="text-align:left">拉丁扩展字符密集出现</td><td style="text-align:center">+2</td></tr></tbody></table><h2 id="修复的三重安全门">修复的三重安全门</h2><p>修复不是盲目替换，而是：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">① 尝试 GB18030 编码 → UTF-8 解码（逆向还原）</span><br><span class="line">   也尝试反方向：UTF-8 编码 → GB18030 解码</span><br><span class="line">        ↓</span><br><span class="line">② 修复后分数必须 ≤ 原分数的 1/3</span><br><span class="line">        ↓</span><br><span class="line">③ 绝对改善值必须 ≥ 8 分</span><br><span class="line">        ↓</span><br><span class="line">  ┌─ 全部通过 → 写入修复 + 创建 .bak.mojibake 备份</span><br><span class="line">  └─ 任一失败 → 跳过，标记为需人工检查</span><br></pre></td></tr></table></figure><p>三道门全过才写入，任何一道不满足就跳过。宁可漏修，不可误修。</p><h2 id="集成方式">集成方式</h2><h3 id="github-actions-一行卡住-pr">GitHub Actions — 一行卡住 PR</h3><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">haodehaode378/text-encoding-guard@v1</span></span><br></pre></td></tr></table></figure><p>PR 有乱码自动拦截。</p><h3 id="claude-code-每次编辑自动触发">Claude Code — 每次编辑自动触发</h3><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;PostToolUse&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Write|Edit&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;python scripts/check_mojibake.py --root .&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Check for Chinese mojibake after file edits&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>加到 <code>.claude/settings.json</code> 里，AI 每次改文件都会自动跑一遍检测。乱码当场发现，当场修。</p><h3 id="直接用">直接用</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">check-mojibake --root ./src</span><br><span class="line">check-mojibake --root ./src --fix-gbk</span><br><span class="line">check-mojibake --root . --fail-on-find</span><br></pre></td></tr></table></figure><h2 id="技术细节">技术细节</h2><ul><li><strong>零依赖</strong>，纯 Python 标准库，不需要装任何第三方包</li><li><strong>双向修复</strong>，UTF-8↔GBK 两个方向都试</li><li><strong>20 种默认扩展名</strong>，覆盖 <code>.py</code> <code>.md</code> <code>.js</code> <code>.ts</code> <code>.vue</code> <code>.html</code> <code>.json</code> 等</li><li><strong>自动跳过</strong> <code>.git</code> <code>node_modules</code> <code>dist</code> <code>build</code> 等目录</li><li><strong>JSON 输出</strong>，方便管道和 CI 集成</li><li>Python 3.10+</li></ul><h2 id="谁会中招">谁会中招</h2><table><thead><tr><th style="text-align:left">场景</th><th style="text-align:center">中招概率</th><th style="text-align:left">后果</th></tr></thead><tbody><tr><td style="text-align:left">Claude Code 编辑含中文的 Vue/React 组件</td><td style="text-align:center">极高</td><td style="text-align:left">UI 文案全变乱码</td></tr><tr><td style="text-align:left">Cursor 批量重构中文注释</td><td style="text-align:center">高</td><td style="text-align:left">代码可读性归零</td></tr><tr><td style="text-align:left">Copilot 生成中文文档</td><td style="text-align:center">中</td><td style="text-align:left">README 变天书</td></tr><tr><td style="text-align:left">CI/CD 自动化脚本处理中文文件</td><td style="text-align:center">中</td><td style="text-align:left">静默损坏，上线后才发现</td></tr></tbody></table><h2 id="为什么做这个">为什么做这个</h2><p>现有工具要么只检测编码（file/uchardet），不检测乱码内容；要么需要人工肉眼看。没有一个工具能同时做到：精确检测乱码 + 自动保守修复 + CI 集成 + AI 助手触发。</p><p>这个工具就是填这个坑的。</p><p>如果你也在用 AI 编码助手写中文项目，建议把它挂到 CI 或 Claude Code hooks 上。早发现早修复，比上线后被用户看到乱码强。</p><p>仓库地址：<a href="https://github.com/haodehaode378/text-encoding-guard">https://github.com/haodehaode378/text-encoding-guard</a></p><hr><p>欢迎拿你的项目来试，跑一遍 <code>check-mojibake --root .</code> 看看有没有惊喜。<br>提 bug 或建议我会优先排进下一版。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;一个中文乱码检测修复工具-ai-text-encoding-guard&quot;&gt;一个中文乱码检测修复工具 AI Text Encoding Guard&lt;/h1&gt;
&lt;p&gt;最近整理了一个开源项目，叫 &lt;strong&gt;AI Text Encoding</summary>
        
      
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="开发效率" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    
    <category term="编码问题" scheme="https://college-github-io.pages.dev/tags/%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/"/>
    
    <category term="乱码修复" scheme="https://college-github-io.pages.dev/tags/%E4%B9%B1%E7%A0%81%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="UTF-8" scheme="https://college-github-io.pages.dev/tags/UTF-8/"/>
    
    <category term="GBK" scheme="https://college-github-io.pages.dev/tags/GBK/"/>
    
    <category term="AI编程" scheme="https://college-github-io.pages.dev/tags/AI%E7%BC%96%E7%A8%8B/"/>
    
    <category term="Claude Code" scheme="https://college-github-io.pages.dev/tags/Claude-Code/"/>
    
  </entry>
  
  <entry>
    <title>一个个人调研 Agent TopicScout</title>
    <link href="https://college-github-io.pages.dev/posts/topic-scout-intro/"/>
    <id>https://college-github-io.pages.dev/posts/topic-scout-intro/</id>
    <published>2026-05-21T02:05:00.000Z</published>
    <updated>2026-05-21T02:26:43.563Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一个个人调研-agent-topicscout">一个个人调研 Agent TopicScout</h1><p>最近把我一直在做的一个工具整理出来了，名字叫 <strong>TopicScout</strong>。</p><p>做这个东西的起因很简单：每次做视频、写文章之前，都要花大量时间到处搜资料、翻帖子、看视频，信息散落在 B站、知乎、小红书、微信公众号、网页各个地方，最后整理起来又是一堆乱七八糟的链接。</p><p>所以我想，能不能有一个工具：<strong>输入关键词，自动帮我把全网资料爬下来，AI 总结归类，最后直接导出一份结构化的调研报告。</strong></p><p>核心流程：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">关键词输入 → AI 追问细化 → 并发爬取多源 → AI 总结归类 → Notion 式前端展示 → PDF/JSON 导出</span><br></pre></td></tr></table></figure><hr><h2 id="它能做什么">它能做什么</h2><p><strong>1. AI 追问</strong></p><p>不是你丢个关键词就闷头爬。它会像聊天一样问你几个问题：你想研究哪个方面？时间范围是？关注商业方案还是开源？</p><p>问到它觉得够了，自动标记 [READY]，提取标题和描述让你确认。超过 10 轮还没问清楚也会自动兜底，不会卡死。</p><p><strong>2. 多平台并发爬取</strong></p><p>目前支持：</p><ul><li>通用网页（基于 Crawl4AI）</li><li>B站（视频搜索 + 内容提取）</li><li>微信公众号（关键词搜索，调 we-mp-rss 微服务）</li><li>抖音、微博、知乎、小红书（参考 MediaCrawler 架构）</li></ul><p>爬取时带限速策略：全局信号量 10 并发，每平台 5 并发，遇到 429 自动指数退避。</p><p><strong>3. AI 总结 + 自动归类</strong></p><p>爬完之后 AI 做两件事：</p><ul><li>生成全局总结（500-1000 字）+ 3-5 条关键洞察</li><li>自动把所有来源分成 3-8 个类别</li></ul><p>每条来源在爬取时就即时生成 1-2 句摘要，不等全部爬完。</p><p><strong>4. Notion 式前端</strong></p><p>三栏布局：左侧分类筛选，中间来源卡片列表，右侧版本切换。</p><p>每个来源卡片可以展开看全文、图片、AI 总结，所有字段都能直接编辑。支持搜索过滤、置信度颜色标记、有用标记。</p><p><strong>5. 版本管理 + 导出</strong></p><p>同个主题可以多次爬取，每次是一个版本，支持切换查看。导出格式：</p><ul><li>JSON：结构化数据，供下游项目复用（比如做视频脚本生成）</li><li>PDF：带封面、目录、正文的完整报告</li></ul><hr><h2 id="这轮重点做了什么">这轮重点做了什么</h2><p>最近几轮迭代主要在：</p><ul><li><strong>微信公众号深度集成</strong>：扫码登录 + 关键词搜索 + 自动爬取，改成关键词搜索模式</li><li><strong>B站关键词搜索</strong>：不只是爬单个视频，支持搜索关键词批量获取</li><li><strong>LLM 配置卡片化</strong>：前端配置页改成 LobeChat 风格的服务商卡片，直观好用</li><li><strong>Windows 兼容修复</strong>：爬取在 Windows 上崩的问题</li><li><strong>AI 对话 Markdown 渲染</strong>：对话里支持富文本了</li></ul><hr><h2 id="技术栈">技术栈</h2><table><thead><tr><th>层</th><th>技术</th></tr></thead><tbody><tr><td>后端</td><td>Python 3.13 + FastAPI</td></tr><tr><td>前端</td><td>React 18 + TypeScript + Vite</td></tr><tr><td>爬虫</td><td>Crawl4AI + 自研国内平台爬虫</td></tr><tr><td>LLM</td><td>OpenAI 兼容格式，默认 MiMo，可切 DeepSeek/Kimi/MiniMax/通义</td></tr><tr><td>存储</td><td>SQLite + JSON + 本地图片</td></tr><tr><td>PDF</td><td>WeasyPrint</td></tr></tbody></table><p>代码风格参考 Karpathy：单文件优先、可读性 &gt; 一切、最少依赖、直接写不要过度抽象。</p><hr><h2 id="跟其他调研工具的区别">跟其他调研工具的区别</h2><p>gpt-researcher、khoj 这些我都看过，TopicScout 的差异点：</p><ol><li><strong>国内平台爬取</strong>：B站、抖音、微博、知乎、小红书、微信公众号，这是其他工具基本没有的</li><li><strong>Notion 式前端</strong>：不只是导出报告，可以直接在界面上编辑、筛选、标记</li><li><strong>JSON 一等公民</strong>：所有数据最终都导出结构化 JSON，方便下游项目复用</li><li><strong>版本管理</strong>：同个主题可以多次爬取对比</li></ol><hr><h2 id="仓库地址">仓库地址</h2><p><a href="https://github.com/haodehaode378/topic-scout">https://github.com/haodehaode378/topic-scout</a></p><p>如果你想试用，直接从仓库开始。Python 后端 + React 前端，<code>python -m topic_scout serve</code> 起后端，<code>npm run dev</code> 起前端。</p><p>如果你有正在做的选题，也欢迎拿关键词来压测，你提的 bug/建议我会优先排进下一版。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;一个个人调研-agent-topicscout&quot;&gt;一个个人调研 Agent TopicScout&lt;/h1&gt;
&lt;p&gt;最近把我一直在做的一个工具整理出来了，名字叫</summary>
        
      
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="项目实战" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="调研工具" scheme="https://college-github-io.pages.dev/tags/%E8%B0%83%E7%A0%94%E5%B7%A5%E5%85%B7/"/>
    
    <category term="爬虫" scheme="https://college-github-io.pages.dev/tags/%E7%88%AC%E8%99%AB/"/>
    
    <category term="AI Agent" scheme="https://college-github-io.pages.dev/tags/AI-Agent/"/>
    
    <category term="TopicScout" scheme="https://college-github-io.pages.dev/tags/TopicScout/"/>
    
  </entry>
  
  <entry>
    <title>一个代码仓库锐评工具 Repo-Roast</title>
    <link href="https://college-github-io.pages.dev/posts/repo-roast-intro/"/>
    <id>https://college-github-io.pages.dev/posts/repo-roast-intro/</id>
    <published>2026-05-21T02:00:00.000Z</published>
    <updated>2026-05-21T02:26:24.857Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一个代码仓库锐评工具-repo-roast">一个代码仓库锐评工具 Repo-Roast</h1><p>最近整理了一个 Claude Code Skill，名字叫 <strong>Repo-Roast</strong>。<br>目标很直接：给一个仓库地址，出来一份有观点、带评分、有证据的锐评报告。</p><p>不是 lint，不是静态分析——是模拟一个写了 20 年代码、review 过 10000+ PR 的 Tech Lead，在认真看完你的仓库后说真话。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入仓库地址 → Scout 侦察画像 → 5 个 Sub-Agent 并行审查 → Editor 汇总报告</span><br></pre></td></tr></table></figure><h2 id="为什么做这个">为什么做这个</h2><p>现有工具各管一摊，没人看全局：</p><ul><li>SonarQube 静态规则扫得快，但不会说人话，没有语义理解</li><li>CodeScene 看热点，但不读代码内容</li><li>ESLint/Prettier 管格式，只管对不对，不管好不好</li></ul><p>缺一个能从<strong>架构、安全、性能、可读性、工程化</strong>五个维度做语义级审查，还带人格和观点的工具。</p><h2 id="它怎么跑的">它怎么跑的</h2><p>三阶段流水线：</p><p><strong>Phase 1: Scout</strong> — 单 Agent，≤10 次工具调用，快速建立项目画像。读 README、目录结构、构建配置、CI 配置、Git 历史。不读实现代码，只建立画像 JSON。</p><p><strong>Phase 2: Deep Dive</strong> — 5 个 Sub-Agent 并行启动，各负责一个维度：</p><ul><li>架构审查：模块依赖、分层、循环依赖、扩展性</li><li>安全审查：硬编码密钥、注入点、输入校验、依赖漏洞</li><li>性能审查：N+1 查询、算法复杂度、资源泄漏、缓存策略</li><li>可读性审查：命名质量、函数长度、注释密度、风格一致性</li><li>工程化审查：测试覆盖、错误处理、文档、配置管理、Git 工作流</li></ul><p>每个 Sub-Agent 独立上下文窗口，输出严格 JSON，互不干扰。</p><p><strong>Phase 3: Editor</strong> — 单 Agent 汇总，计算综合评分，筛选 Top 10 问题，写成报告。</p><h2 id="五条铁律">五条铁律</h2><p>不是建议，是底线。违反任何一条视为审查失败：</p><ol><li><strong>有据可依</strong> — 每个批评必须带文件名 + 行号。没有证据的批评是诽谤</li><li><strong>有褒有贬</strong> — 只喷不夸是情绪发泄。亮点必须认，烂处必须说</li><li><strong>拒绝模糊</strong> — 禁止&quot;可能存在&quot;“或许可以”。确认有问题就说，否则闭嘴</li><li><strong>对事不对人</strong> — 评代码，不评作者</li><li><strong>给出路</strong> — 指出问题必须附带修改建议，哪怕是方向性的</li></ol><h2 id="审查视角-flavor">审查视角（Flavor）</h2><p>同一个仓库，不同视角看到的问题不同：</p><ul><li><strong>default</strong> — 老炮工程师：直率、有观点。过度设计？简历驱动开发？依赖膨胀？</li><li><strong>google</strong> — Google 工程文化：可读性优先、80%+ 覆盖率、style guide 合规</li><li><strong>startup</strong> — 硅谷创业公司：MVP 可交付性、技术债可不可控、上手成本</li><li><strong>oss-maintainer</strong> — 开源维护者：CONTRIBUTING 指南、社区友好度、onboarding 体验</li></ul><h2 id="评分体系">评分体系</h2><p>S/A/B/C/D 五级：</p><table><thead><tr><th>等级</th><th>含义</th></tr></thead><tbody><tr><td><strong>S</strong></td><td>该维度几乎完美，可作为参考实现</td></tr><tr><td><strong>A</strong></td><td>优秀，偶有小瑕疵</td></tr><tr><td><strong>B</strong></td><td>良好，有明显改进空间</td></tr><tr><td><strong>C</strong></td><td>及格，问题较多</td></tr><tr><td><strong>D</strong></td><td>不及格，需要重构</td></tr></tbody></table><p>综合评分由各维度按 Flavor 权重加权聚合。</p><h2 id="大仓库自适应">大仓库自适应</h2><p>不是所有仓库都值得逐文件扫描：</p><table><thead><tr><th>代码行数</th><th>深度</th><th>审查范围</th></tr></thead><tbody><tr><td>&lt; 5,000</td><td>deep</td><td>全部源文件</td></tr><tr><td>5,000 – 50,000</td><td>standard</td><td>核心模块</td></tr><tr><td>&gt; 50,000</td><td>quick</td><td>热点文件 top 20 + 入口 + 配置</td></tr></tbody></table><p>热点文件通过 <code>git log --stat</code> 分析高频改动文件得出。</p><h2 id="用法">用法</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 基础</span></span><br><span class="line">review https://github.com/xxx/yyy</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定视角</span></span><br><span class="line">review https://github.com/xxx/yyy --flavor google</span><br><span class="line">review https://github.com/xxx/yyy --flavor startup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定维度</span></span><br><span class="line">review https://github.com/xxx/yyy --dimensions security,performance</span><br><span class="line"></span><br><span class="line"><span class="comment"># 聚焦目录</span></span><br><span class="line">review /path/to/project --focus src/core/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 控制深度</span></span><br><span class="line">review https://github.com/xxx/yyy --depth deep</span><br></pre></td></tr></table></figure><h2 id="技术实现">技术实现</h2><p>纯 Markdown/JSON，零代码依赖。跑在 Claude Code Agent 框架上，利用 Sub-Agent 并行能力。</p><p>关键设计决策：</p><ul><li>Sub-Agent 之间不通信，避免复杂度</li><li>Sub-Agent 只输出 JSON，便于 Editor 解析</li><li>Phase 1 严格限制工具调用次数（≤10），控制 Token 消耗</li><li>120 秒软超时，超时的维度标记为 <code>timeout</code>，不阻塞报告生成</li><li>Editor 阶段抽查 issue 引用的文件是否存在，防幻觉</li></ul><h2 id="后续计划">后续计划</h2><ul><li>历史对比：两次锐评的 diff，看质量是变好还是变差</li><li>自动修复：不只说问题，直接生成 patch</li><li>CI 集成：push 代码自动生成锐评报告</li><li>飞书/Slack 集成：报告推送到频道</li></ul><hr><p>仓库地址：<a href="https://github.com/haodehaode378/ruiping-skill">https://github.com/haodehaode378/ruiping-skill</a></p><p>如果你有想被锐评的仓库，欢迎丢过来。你提的 bug/建议，我会优先排进下一版。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;一个代码仓库锐评工具-repo-roast&quot;&gt;一个代码仓库锐评工具 Repo-Roast&lt;/h1&gt;
&lt;p&gt;最近整理了一个 Claude Code Skill，名字叫</summary>
        
      
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="开发效率" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/%E5%BC%80%E5%8F%91%E6%95%88%E7%8E%87/"/>
    
    
    <category term="Claude Code" scheme="https://college-github-io.pages.dev/tags/Claude-Code/"/>
    
    <category term="代码审查" scheme="https://college-github-io.pages.dev/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5/"/>
    
    <category term="代码质量" scheme="https://college-github-io.pages.dev/tags/%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F/"/>
    
    <category term="Sub-Agent" scheme="https://college-github-io.pages.dev/tags/Sub-Agent/"/>
    
    <category term="Repo-Roast" scheme="https://college-github-io.pages.dev/tags/Repo-Roast/"/>
    
  </entry>
  
  <entry>
    <title>私密文章6</title>
    <link href="https://college-github-io.pages.dev/posts/4eace78f/"/>
    <id>https://college-github-io.pages.dev/posts/4eace78f/</id>
    <published>2026-05-20T08:39:00.000Z</published>
    <updated>2026-05-20T08:33:59.984Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，这个密码看着不太对，请再试试。" data-whm="抱歉，这个文章不能被纠正，不过您还是能看看解密后的内容">  <script id="hbeData" type="hbeData" data-hmacdigest="98a6f4847281329ded68567108a66498d57a3159874a58d7ff9b94efb867be2a">14aa4db32d53826897370f02a563f7566287b29351a7867cd1b2f79db21c8dccab5b65413aa8973836adcd466dcfc6b115d0947e6dab4ca2e5a382d63ba142a7d738bfee7cf3f2e92feaa54b572ebb57fdf95bc5ec977dc772e2aff232c3dcc5bdf7da809c912546501e53e0fe9e174be78917f038a02dc13d8a70917168810cf970f6740adbbcd0184c790250505354048feb7a7fe2652ce3df00be2d0dc01bd9781986c886553d091c25b8225a2713d034794ebb68feb2eeba786df291fd5f097698551af6bdcb8623943db5176562a56eda6f19edafbb001a817c9339adceaeadc995f374f71fcf9fa0f06fedee5661c29c0b8dbd10e1cec21a46144221b7adb1517f616123001d3d58dfe7754e583888fdf00da32ca39de695071e26fc2eac79333079b8faef63cc397ec18dd1925b352436d1ce3992fd62578110516e31e09f47eaa48487eef5a3908dbab81ae7d6eb0d8fb0d19101a41c63dc795c785874d82d8c0a3bab6f58308e4f2d5824f9d3eafbfe3309ae29d7bad09f2affc6aa8b87dff941aaf9aca66eb8ac4dda5dd177a5c4bd74b230ec2c8267f5635ffed5d2cea27317c0d09ddde7622b961912b83abdb4ae47f0c1741388cc40d637c96b4a3179292c09cc55192d92187ca3a5c68207c75546eb722920aa82274458b2eb5e039fd88283799ebd5594caf1b97c721bc0ac28742299a08ab4f910c17ad396b10d049cbc0f8bfab225951b4e580b79dcee268ed4b07b1747bd42680c2246f865f96008fca2356a903c78710e7afa5edffd7ae79d418ce8e188a16d97abf5fad0e7bfb6b32d61a589889a58ed007e374a3ccd1642fda4475f99bbc18e8a30cbaa0000458c699eb920f108dee00e08702e1d89000686e6743106fa9b74371f438714fc2e6ce1eeeb3adcf1882af03a42e404ead26e36a524ae18c2ac2707dad88df376cf993287ee28b1d38f416be1ae1350bf02b334143dd865a0d49b27efb8b9d27755254e82c41f70c1095628f821bf6b367188801f4862c160fca76db3bd4b427b3d1fd7d7044f5cc37326ffc4764e7b6a93e46d8b1b9b138543b70743a1c69a5662f7fa77348f1224022866d54e85b8408cbafc5c3fdc001498cb0c554435a62a37be5e1d394ca656f7dc94051a3cd1581472b136fd50829fc8eaf6986ac078f8b230a5ffe566bf3764473422cb946c503a4123be5e7ebfc07b101b48f2c4b1448ab03481013769e6b36d47a67141bc0df727a811a8ceb1e9bd7baf4bf6cead4cfe310331255f9c1745e5349b6bc91a79c2fa9d48b330e9e26e97574299a01d65818211666a87691873461a684bb0a7b711909624e57f0c04df1cb5c91c073b55c6a31978f400a45d605d130f68c7df90bc1d070e1371c0a0d9b3d37cee481548b1e511fb9745257a9749fdf69c870007f6af44d99332cc13f8b142bbfa81893efb601fb8d5ccd375c7918e5ffab02af23193fad3b1c1de70a63777ccfcedcfe13264de395776fc27c0adb1687ac3287de6f2794a600be02a0e6c8ec937f6ae7700eb12e8d6b5786058db9a9555ace4816f62d733fdbedb31c345f6db1494cfa4583554d49e86e6a35e21e43816d77632dc21d6dbac0f4561dc9a97f245360d656e1972933fe9b86045638bf1cf6970b947cd277c2c50a4da7057e0de73ca9038c3ab56d8bbbb92900649dfb231748830450974b24d78b72989b67ce6986d575a4899620bbb3b016956c6765488756b7d326c2a568f036a43d12b17d13f70ae0b8f07df182cb3c35ffe32b6d5a7e5d43152da8ec8487f129f47d43cef0889c22530ca6165a601a8fc6bb9bde62734aa36bd0083aecbbca8fa766500746c9073f4b07eb1f61e3affe19f9683461215b96fff8a74e8a1ba3e6a3d939d740cd1e4f75477ac30b05a22a19572955da4cfdb476c047e4fc4737531af5e7c118b59e3e1ce0b2aaf1d8d3fdefa76db358985a080f1582cbce7b3aeffeb9b94cd8bc6165672f4a41bdfff79f4e2692622f72e755758efd9057f82b9b03bb56fa0eb46fa4b389a3cf0f5deaf8c71a8371cf204d53e4469e789da0d7cc9fbf6e4439c0329a815a27f0cd74dc07deec7f4e0bf1142a647888b77436821511a2590f21f0cca86120ce9b9e2aff53d7c8e4ea928b60bf1ac9848b162929ee5b8edacddbfad1cff0ad2c9460c1b85dfb30043d2c508df46101a051eed7ed78870a68b7af7d00980b0446116b9992cfea297dbacd42e10abbeb85e74efca7acf0f34988a7176b97071b32a361990a0fd7a7d3050d079ef50166239cd50878e7bf2544a3e243449520486467b9b8eff6d6bbd94215fa041346275098729b51ced414dca74b54464c51a2e2d0235a813ea8dbdc2ba5894ae2d9354358f6c465dcf0b35ba5e96c1567429dca5895042a15d11c0d3b0bec6310e17a33911927dc96c574b75672e5e0bbb107baeb199b2d7f2cac7a51c9e51bff240a20ec620fbad36e6c2c77d4eb1765ed32dc0b8d53b8364fdced896d6d3b238ba0ab9c56f342e2dd31f19c5ef42e21abd0e0f3929f04d87e6f615906a0882da720af7754690ee3135605b7434da93da351275ead567b3152c159187cd84f09bc1390b67089c02ceac39f3288925ec357f0073aaff267700664ff1e9382d50cb4b8996853b619a33b07645c852e2975ffd98e87d98c12073d349636baa8fdc51f913133de5ca66cc2d2379d22f69d6ee480644da255885edc4bfae53cc995ee3f4f91e47f40c2b9a8c1bf49b814ab4fdafb634eccd489d3917808fd9f50b1b2c16e9ae62a576cd273eaa647ed3df6b06dc71f7ec1396aa6110e2f6e215ac0b7a0f39de46fb52d6253735e5b6c8531fb0847abf2835c33392ccf90dee3e4c725be855635d37cdefdcb59fc7f7973058e13b71a120fcfefdca2d3e40bdcf6edbec1f3924474e448f17ceacc9ff35c6f76c642de5aca13e4339c2fe4b3dcb248d1ded76efbacca3444b98d7ceb17951db1c8d76f2c3b38fabf030012d5515492d79d81bcf9f422d9cde99b8be93f550946b9dd5029c7aa5b7519e5ed4b5367c881b7ad96662353c2d0e5dec3d36620e379c0dd67abccad3f98c95907ae5759506b5bc4f5c92007ff298d5d7bc56f18b741f80e298c62efff49f370febde165509fedaac688a38a12f82559bb6c9285ab968830f7107387bb7c2d7f3ba636a19bb6705965917343085723ea4874514192957af0e04f2209c6724816c79a25937b109b45fa4eb27e231df84489dbb4c2103eda000bfb3b7e4d456baaa1958b11076a0e614447f36aaa3e1dc8cfb5b526a2696757ce6a144399cf7119f0cbeb92bbe3ff38e4707e518ea468cfe40111c28fa05dc145aecf3585276b1887ed387e5b89be464d666631c782184ba488584d89c3e9746601037059ec7c79f69c0d9bc06ce6cabd04ef10ac09ee44b42ff4ac240c69e63633d1c8f7dcf11410c212c5827ea1e4ac20ba096ba5084b1f07adde941c3bab85fc2b78a23e91e2112e034cd58baa7c79c8874ec8dd12e54280cea89335b5c0c19ab56711c921335ef9890c6266b4525479c76d078c9aad6f4af350f3038ad8e30e705727eb6952217f42e810be822797ed92c0cbf87d02d5533aec96aa92708ef89a4e4d49ec72e92fc2a5954ac3d12c68360dcff20303bddbc9d292029a4854ad2cfbbacfac99ce7acbdd4082943835457ade19da8eaed4ce495d84a818c47599600073e081a5e7b3df89788c0302d4bb759e784e17967a2892365f339ee919198818f9f7b0882eb399d5b4bc2d0b5278a4db18f77ed1a9b5de6a9a5a00848c47391f2f2164176362e2b0f53063fbeac2a0357497ba4d443a55f78aede80afb1e70a2a1ac8b06530705979a816ace7fafb29a41bee504b3c8a4bfda374ec2c67119599e966e82eebd8ad98f8621c4beaa2a671a07d4a8c9213ce22be32895eac5ad6d9a0809f680421800487d31b2491e802887b5ef08f764d5a2f82af7910b4f4c7495b9171f72f5a5ae7067f77c1b45396033c9adfc86e8dfaef7a23e243ebec93b335f66f7becf00146936ed22fda55dbda176fe046d47ade4ed54c6e837716fa0811a9e062e131d0d57d8bfba6e27c893c1d1757287b97d0fc4d22a0ecc7fd63228adfc44ada4c8d44e3f3aeec7b2c555bc01c3cc55e42b266690b83fb589c84154abcb564f90bef3c64b3d475b063b2dbf9bd6b9307a53561f39f41cde310e467f5dfbe33a58d29a21963da412191b5a19cbe5037012790e4fe61b66477622760d91f7ab97d5b7adcf54f2b1675f0216384769591cc6a4409581f0e3f1f9fe388d87946cd6fcd093f2e827be490de23b219182aa893479f2cab967477f75d197d1f534a3dcd4dd70335c628ff94ff55b235c41e91c5a3385c430ae6f76e450b2579a9fb29a01fae928f0ee615f11314f4f34d976764212b5eeeb23a9437819685d68d04e50b5d34de3f69655503e02bee3eb782400460a6f815e407b17cc1f8d201227f55e17d1290489acd749a2dd213556acd021a323374762400bb6a4c9053d5aea02664a7e2093f4d95547a86a03f0a90241fd3b601632cd4eba9a493daeede72f7d69c2dd82168c481d4f81b113e0b9ef0c204d25b23e5ff510edd1ee28c0a629f4b777e4007277e24312cd2207d90039cbc1791085e1c3f95173e22a081ffa37cacb1ff1a857227581c6b1cc2ffc102b381d6a0c12d9e389f00c4d3345cc04cd123c3fcbf7a42d8175080f442ecaf2cd4f38ce0000cc358a7fa9567cfacd7fa749e6d9b76e9cb467b5221f2842363a1a8bc15a88a16c60cebaa30d7783f19b6e965c1dafe2a61f0cc664edf6e2cc49c11c2f382f3ab8765cddf7471b78534c9d0c087d4be48247afe347fe22846262e6c82d98664affcf35731b0ff9251a4777800a68ef114d07285c619fe9901a0d94cdd1cdc7a884e45d0c9b3aa08077aa9240bec6d7ce903cd34f51e2542f4cfe522bdc02addfc210ce912677c95cbc31b7e2563dd6ef9c18d2c31d3c9c34541dbc5331f43b7f245067eee4fa523b8295a990e53598d911c89b438b28a9cf086d55b4562d40b4d42838a8552aadd086771070dfb36f9c3115d486efc34428f7247e0e462c2976045e2bf244ef49fcd0296658190087ee1bad4776d90e750fd623db67cebd8eb782dd0f3698983ba0f60adf35892112f693030e4fe7c70ba40d1e72baaa51158adc3d495c03918457a25b98e8fe12a0fca2b9054b279fb45e8488a1f8fd63de92e8386e6fc40ee9e0fda9183e43c459ae664d05c88b2836bac5b6ec1da094c93a80b2bc21ccd561615cea1da7baae78ada3e5a2616be1f7f0ba8bf80c870411160ae16da4876eb7ae132a83075f46ad79cd91545771192980021d8c998ca6227af2d7b7b83275a2594e13aee09c546969e2b6633a53ece1c511a8be18dd5492fef37e4246eb386efeb0b3f5d2f4ac79aada2216756d43872a45bebe889ac0154805a75b3cd1326cf56edd64077a2e1cf9255f206275497e3fcd53ae5701a9791e3f4602ebb5b82edb49de949a9970cb4af8ea861d2e29c8d72ba7fe510d25e99e0a9d31da5e8494607e3b7a267c3762d17a25c13b3a16db3352e2907f686c43093767e21b2ec941de29c211c950f23b8876b45b5dcbabf3a619352fc5bc4435aaee5a8277e0e634ac83bb992f82477434b34b543355d62c19416659a8b99e49356a8e84c373c3c5ac07c265073a5472270cbe9f0ce5f3e405b5918afc97a555cb0fd73a08eb0329fa93e80ebfa61658da25229ff70d46f5b5684c1258bd49f248038b8cd0470b30b94b8a36d9e21e74ef017c63930cdbc6418ea5e8f8d27385e111d589fc74b40b639af6fdcf20200faaba665d7a997858a8c863648d1219c355bf4059319a3e5161f7e3edf7d9106c8c64251d015b02312a42a4c58b1a3506798d1e5dabe0137fa3bc2062034bc831c5fe57717f77c5dee94c0550bbaa3d6b66c8f512dd5349040b0f73a37ff9d68ea5965f62429f7ddfe6a3b48adc51b17df5957ba876827c90b12282ecc0078535e67e374dc6f4fd347b32574cb0d0fe10e55579ebeaaad4737b50bd68c953a663d40009fad1ba9327e7ecbcde645f90a3bebad82a9a13a0035a7aad4fae5dcb062bc79d3affbcc571ab445a841f3026e17d459c94b0f4f272e4d7ba76f444e40dc9dc60f93161a15b94c22dcb1f36aef62adc71cf3e84fcfcd598304b15dd31a3d35e6f494f21f432a624768f5225d0e032fb58a082ba59f6e8a0d62178eedb6273afbbbac4379761c3ab5659edc30d176f25007d542629546c9ec0a69cf01907d9dec7a97034b95e8f822d2bc6798ead977ab994a643954abeb07f96102f8284e2f1e6411c1bacb2c23e2a815ec4355dbe206f9b105d6a5ba2e4936f034ada33b659f3216c5a1b6a01545cc7df4a04b5ce678b73f049055db1c50556b95cbce83e057c04efed794164eb01902ba76d0e57a6a63c038df0d6ac2eb0debb299a77f37a5bd7fe53f23e78cf11c25c6c2b7940762fc3a5ee05fc842bf526fffb7128c913c0b7c7264bc446e1f815686352e7a413e1cf6e09fa7b9750be3149030efe20d982cfae05643e5b615064ae4cc5f788388c2a331d2cc53557a49a599ed3baf4d9411f14ac8ddf93d0ae8676452c262ffee4c91b5b38e120990ece54393dc04588ae19e5dcd8ea62ecafc9670ae9d463ed067382135d05a6b062d38885b9fd6d83f346685122e4d2bcc05f3a8e207f29a51fec8225c9453e060443df7878720f92602f84cf1574add9da6999a01ff23e848070fa7be821292ee4e30c6013ec33a97247f27aa4cc5ddd1b7ae36495da5cb85a3c6c661a743bc19a391f7bad4c419c6ef65e3546f7b9d0ccce7ae410f1335a2748d35cdc9e9e929b4f14c7dda2a979fd84603f969287ffba7cc7c07639f4a787ab7a64111154f57f57bb9b0df67aeaa92623c09a57a0105edaf57f97c1625071a419a415fc904ac47cf66465fd34b9e54938468f2190f8e4fbe2805081cc4dc2069b36e2e9e31cceaad8f4b467fa9f2921a48ee1ec9bb62127d0173ab17aaba774f5a7d8f62f09af7a38c8d10af021721b5123ea2fcfedcbe8e28cb5b5b30b7b477d4bcd9b929105b4ffd38500a6885e2fed329b09b0213e925ead9811afabb4f24335545e80527a18396300ee9c7b39d6267cc45959584cb0979e3a65da1b7a6c6bdd4cec2a6eb5969aec430ce12229ea8231633c94247a160cac09261318d00f8568547b7eece0d93b598305451a85a827ecd2a69603f6ddd2bd0d9c0d356b0f03ead4ae04e7599c05eeabd7e4e040540c4bd2d0d5974cc671097afff784941f5fedc1415fcb3a5319443e26202bd345c1f0f6ed19f9a18a1a25a30b002810c3109eaf3887f6b0ad004b0c1b849fd917d7806585ee07562e64738a0512c8f7f349f52724c39586fee7af475bb26239ce7e34220392576611a79b61c9da619af78165a30ee7b5208efd795fd1415c781eef07e5dc4253d8a06ba3e7c5595348fbbdb879b508f2530db6a5a24084585211fbb0209ebb91057dc46807c7b76c8d7a3bb9ce22358edd15a370afcb39fe809e80ec4fba4152976945a96eaa14e18c473c9a2f6fb295560cc96c62d6ba89150b2311e8f754cf230f0dca792d998b6804cd8687e2958250fe0370761d251fd78f2617b2d7e2a6ee45e060b8f442e4b466c6ce230fcc83d6a5ece57a12e3fcdb1ebf6c41db3b1cd68c457805687b11c83e3773731e5c824dad49f5dabe0a6849cce4dae5eaa3ed7cd278522adaaff704114bd4996934e2774bc85a6fb7c93fc884e0da400ddd06b358e5e17f680dce72cb0bc31d759bd6245ec1aac12b81d1aabcf540f15a32a9e3e02638876e37d5b39165c6a9ae9455f3c86c238d0c009aece9a027cddfa4134cf930393987a34842a1f491570c9bd5f2788fda95e3997bb296e9f4bc83fff568f4ea18b99749503d2035a7885a3bc3d735e42fcd05583202e74c217e9ec1ed158d992af982155f783ab09e568911a9e8b5e9fc13b134f9af1a561e5d70f9984fa1d38df81e4091871566172d3dfa23e1070db90a919a225f27df7ed3d0963bae9bf45ef740276b6ea1957b486e74f0967c122ac0c27200448077da5ca16ebde7665399914d75f8805d150b33dffd18725eb92ca0da5e6c7763fadb49e63acdb5f4fb50f6ac6ed2c065d64fd0895b18ae83da2410a05b1ad9992254319dc6dd8dafe6bfa14a9a9bac5f6468840f597e8a0540d21305fbe3b9c3d29b4a7023c6aeb275e36e2a328e65933b14cf504c83014cd7085733f4c4c957253ae9fafc1668f1c80f136d23711949018c0094ab9100578efe8c6de725f1dd93d185c7134113cd618bcda9cb7b1de65309e2130e278c17fe915c26279f01b0b14256bb2121cd148cd7a999b41c94906b39ef6bf4ce200cf17047cbc88fc7abe56939bf1563bc8b2c119bf5454e494a20685c3b69eb5c505839dbadff479792210baad30cba4bd73b1bf864b48448b6248a4751bbb250a426e89ed2253851a129096ab32ffb5f6a235abc599486adfb9bbc5bcd4cbe31fa6d9ae665ca4e01acc44d834f5fe9e716a30104c59fe79aeda77e1146458bed0ee2a8a921cee87e490b9354130957410c88ba9f66f66e517838009ad37c507a6b3da9c6ad8fa4b19bcda2c49577e8a99e78550cc35c79734e626a7ef6defa52dd8a8a260f97a064dfb790e4680e9366adfd5087a18e64dedcb13bc4613b27220bb1c99d163c1dce367e9b9f78407d8c6f826f304bdd4d4403fe080a10b6c5b0adaa87f753735ce886220c388c356811e2d66337e948eb8e6f7ba3e1b8f088d5a308926df00b28b630d337e229ba391f3008f4e4b18bd8941c01aa11c57ec9733cb7decd66fd2e63861a2fb11885c12df89b469790d04225d5852b8050606e937702fce571fddbcf52d86a568027a95b59ef748ab2d2c27051d827da2f2fdc45f1ecb57ffdfdaea65d02915c634143d55854dc00d87c5cf163031039f3f3d7e4671870156c0720a3d2eb72125020cb02f101603bcc772e2657626dc6a20bece37092dc1c79ffc57d0a3e6cb9c0c45711a134d11a7a9cf46ffedb23b6d785b16bee8b05ccab2327b072a3b2e428be0eac5e6d344a59d31b83f79416ff5d16d3c75e217bdf17d8e86e82bf5d1c6ae31184c26398d0f0318c9c51097f6bb9cd7746e9c9ca5e6e42fa0ca9c1b4cee6f730bb70475fe258271064e5d94fee342e1ff871bc8f35842e22c8cb0cd424821d7449de6c7c2ee08d69d2a5475493adee6a1fec37368f2fb111834828a8331a4c06b0fe8a1440fce2acc5c34a1001df03ad1fee8dba73438c32e63253c99fd52df1c4a78c09ff56f25793964cf82316f1d5c61f747e536541edca7fa4297454aae1a99568ec5d9c1371d9295217821563d9179394cc755327abab4061614d92a05870c8d22b66c581415c339f56a2636f2cffe3265a96895744496653b276826acd8f61864b04d044c0d787ddcc529dfc0bcd611f9c5ad956cd7135dab423a06e5da40a6779d2f992c49efe594c1075449a190ccef174fe9d22ed11564ed42e59237212a9e7e8cfe5a470d5e85480886a55fb17a0f3d6bde730de85c6ad8b708c822fcfbd547c93777c6e3b7ae49a011b0caf8934f8911005e8dee8f7f9da6de246bd24752ec327ac912d9842edb61f7867c46f660c3c6d206e87884e3d78e006ca42c6baf48511b0d7f23530fa93ae951746cebab8da4eb2e85ae164bcc7ee6f19b0d254852e91d813829b48a7a2f9979986ab530e89a15bb8a5376250a6ccbf621cb02b3cc27f7d4ec9fdd672297dea1afe92c06dfeb1f2dd9ce61e84903dd0bfe1c0b8ab784807cf8d6d88e8c48ec3c272de018370a0dafbd3e4d7128847956dd695ef530b664cca3d0ced9b795c8b5633db4300b5d6a296fa8fb27c612fba977b4e9ce1970b8724535fe0cd6314a00f6d518a8ff41bede3f5a88175ad6039076f5c83e63917d6c6bc5905dab8b7d4031117c702e2c94b7d9830ad56090ab8249a15fef02efd679ada0704adbf2890ec96d76742eef5dab579f7a81dfdd1a6066b02375e516163436ff23ab39ab7b409c7a06c1f515374cdf6250cdfc4734c9080d9caf67210736f9a76eb84888aa9a8cf453379ba5eabaf104f301f47bf23a0217814840f99a54f54b1471a419416e92bba8003a1a61e21a511047d135e3a6fefec3e79c7388270fd64438765cfe0defa405f3a2c4cc9cfacaee65a76184f6e439e1a1077809614ee42f6f0fba154ca0e271394f2b956dd43efde90ecfa9df744c4bb4997330938734b25c2a48793a8765f75d140eb4341a99d7c8bd5f9c72c6fb51483839607c28ba7746fd062cf6237b06d7a1c4155259da1ea907536e89a3691bf91a5adb8dcc7d2b2770c712900bb34672953d10d3028229fd4dd95ffdcdff398c315734643ff9c4a6263abd8699fd822480e384f6a0752222201a9369ae3a68cf02bd6c955d27ad93ad473a48e90e20e9710d15c6db20813c776ad739b9bd18b7ac57a0eed61063141047ce3d54c8a247ff8449aec4fd153b698f8dc3356a02f291776d45fe939e4930d290dcfdb3c6df753e879ed5d86f390238c8c854970c5c718529653c178cd766e5726ec446aef711024049f003ae650e1de9b2edd227979a7d93cf0dc0e6c986f5c4b8a0bf2667dfc95adc801a6128801f05ed5a1114c4e146bdf16499b5a8ff87624be21f06e0390de6fabbeab1c537dab3c3641fe1d09af22eac518df13660491945deb6b9429abac747f0eb5b3c83513550c4afa1908f87217dbc5e99e2d87d19d61316552a3643e67aa08122d13fb7f981c78291fcb93b7411c715de396bda3ca7655cbfb7004a9a85f1459380e63b3665a26a3f763b82a4c276ce282cdc04882be1a3474f682dd50e32aa7b3ec221421eb10238f96c91a205be079d125af1dfbde98732759bb543d27e5d84442f6ea96b382ed4efeddd0fd93856f0a978b022c9976668dfb549e1609e7f6ebf1f1dc02e8446b493a1b952b589bb9171a9b47caafd2ecf93d52394b5d4fde6c6bf4255de09bdaced39d01063634d70f7f2cd021928a886e548347f5ed46fbcc8bd2d97ba44759c5c4309c8858ced70b4bc4958ec687601c2ce4d944154d1fb0e3bd06ead6aabba0f1058c1ea6ddd616a8d6aab09bc6298646ef990495988ff0606d3aa055a7ce4c5518e566d87edc8763b92055fe319a144355da1609297e6932a96bbfc3ddd3ea71e286b40c98eb6eb17ec7b95e9e0461c23432ba652af4e2981ac5b3143042aa1369e6ac11f5426d941d7a0024998633a308c59a138585dfd683188cd49ddf20f3527811cdc7bd7a88656ff68b686b0647e07b9caa74e8b9ead9bda0748981f77511878f536e5e02ead4b56ad66a5b5708fc2e3383926a02ec53a17683e8e6fb7bcc30a46b56bc2ceefc3e5b4c278d37b599e592b930a1529f020e235476ca2dd7cf0a59fb24c25b65a667622d310bd9506f7748e18dd469a9962acf2465d9b28225736424578c7336a7ea259d4fedfbe9eec1547fe061012507003fc3ad8bd2b8f958a49d854d86d01301db9cf7c0ce446289c02ee5a9116cb5d3c42a31094ae822096e9b18c1478425a90c3ce25c9feede9855b8e7a081b28945089108bc7410b768a34f1cb2aeb0dabb5f422405352f9ee4c2d896774fda6c4e4466d7cc950e9fd6b39f1e172b43c0485606d5a04518fe77b550596fcdc12dec8b454da39392cb089d98d91a91be2ba1e9f9cbfad027ee00db83cbf5f5584cb32fcd51f0cdc20af0d148155c100c09455756569bdf80edde448df7bd5ff6f109beacc542b22a43d67e6863996297df963926e88ce08df9dacf8b7f3388b818f2a831da5ee074049ed541f7f8a4a885045d9670d7d2dccae2d8e3d5bab819bc014ae434bad84da6bbaaf10a9694912cd5ca8c6c26c550694cfdb25d2d4ed51cd9c4f1820844641fd9b3424a446efce170871dcbc4e7649b02128f1112b65801fcc5da73b691ec89d895aa7cd0c32dc89965a9903cba932333d174309bbaecb27bf601d0692a4150ae2cc5c7d35900314f5c87275614b61f852c4e83cf369b97a146c8a0194c70ec0513ebf15fdbe22dee891ad78a750c2c9811ca334b599fb4ea9683f3530f7b1df1faf798813ff424aa3f5fe462076ed2d49066183accbd32e9d2085514aa4a3275e430f0a6069a4ed980f56c124a93c819c33efc35b6f2b71b4853457c1f374c87faf3fddc8f546bc639b42d0144caee63cc42a22fc12e6cb9eb3e3b152dcbf9c39d5d3f7306a57b75b8ea525e61027c7c250707c4de47285afd8e061a382f1e3c2a4d6a5f1fed79e92910c50162bda61deb6c8a048abb9462d3959c445c05e3d7a1c8abe890744229fa9e3c3383019d5e8e3dfcd2206ce57cd479e8ee18845e13f101635d01a320c53d479365da62ad1abc452fe9992a3c3d143d84067c5b3f2af416fa6059e7b72cc6c93555ee934f89e8a27b68d5cec5c27a3a249320f6094772c18cad455778e3cb584cc2202643473a8d6a65e84434f9c67ce0ef4444380f0a3d95f01cb19dfe31ef579989deb8412fd64cf81b86a7b202a1aabd266a2d653972a90cdb368b395e3e2be78f8ed633c0d7f85830ae84915376d6238d9f0bec8c300367b8b43e2a50f4b93e314b444ea12011b91c4f45922fe105eb370a8391aad79bceeb2c27b1e408eeb98012a58337b0f5940fa65474d941adaab696f1c1a7db417b66895ae3fe5730a1df22702c785aa2f455dfa9469ae6dbbf63eff820e9ff583b6282d03458c97697874bfc44f57833815718f7bb960ac547572f3f550cb45a84e719a3d4c7f94fa627caf3ca7483403b211a4550b3389b813419ec6b7a2f78560e340a0efaee8078d50fd4ab90932f6fa41053aee9dc30880dab895f64840155d5a7d06c158a2b7d3208ac53cbdccac3875438d55a379af071d7990a5e69c43446de4f619fce8725e511f6d7997859cbc360daa88257a55d331533d50d603423d9e2e2b02a7f5063742472f929703dfce28f7b770b1e3bcbc9dbeeafca5ee64da450daab736b366a27a74b0b631652a29fdaa304cd08472bac52661c1d7df2ae4bb35104597316500004740d2a751068c12d08f80ac83b95e2f05eccd</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好，这里需要密码。</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">这里有东西被加密了，需要输入密码查看哦。</summary>
    
    
    
    <category term="私密文章" scheme="https://college-github-io.pages.dev/categories/%E7%A7%81%E5%AF%86%E6%96%87%E7%AB%A0/"/>
    
    
    <category term="article" scheme="https://college-github-io.pages.dev/tags/article/"/>
    
    <category term="私密文章" scheme="https://college-github-io.pages.dev/tags/%E7%A7%81%E5%AF%86%E6%96%87%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title>数据库第三章编程作业答案</title>
    <link href="https://college-github-io.pages.dev/posts/bed1638c/"/>
    <id>https://college-github-io.pages.dev/posts/bed1638c/</id>
    <published>2026-05-20T06:51:00.000Z</published>
    <updated>2026-05-20T07:05:37.416Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数据库第三章编程作业答案">数据库第三章编程作业答案</h1><p>数据库第三章编程作业，共 <strong>10道SQL评测题</strong>，涵盖UPDATE、GROUP_CONCAT、ORDER BY、子查询、JOIN、视图创建、聚合函数等核心知识点。</p><hr><h2 id="题目与答案">题目与答案</h2><h3 id="第1题：将所有获取奖金的员工当前的薪水增加10">第1题：将所有获取奖金的员工当前的薪水增加10%</h3><p><strong>题目描述：</strong> 将所有获取奖金的员工当前的薪水增加10%。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> emp_bonus(</span><br><span class="line">    emp_no <span class="type">int</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    recevied datetime <span class="keyword">NOT NULL</span>,</span><br><span class="line">    btype <span class="type">smallint</span> <span class="keyword">NOT NULL</span></span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> salaries (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    salary <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, from_date)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> salaries <span class="keyword">SET</span> salary <span class="operator">=</span> salary <span class="operator">*</span> <span class="number">1.1</span></span><br><span class="line"><span class="keyword">WHERE</span> emp_no <span class="keyword">IN</span> (<span class="keyword">SELECT</span> emp_no <span class="keyword">FROM</span> emp_bonus)</span><br><span class="line"><span class="keyword">AND</span> to_date <span class="operator">=</span> <span class="string">&#x27;9999-01-01&#x27;</span>;</span><br></pre></td></tr></table></figure><hr><h3 id="第2题：按照dept-no进行汇总">第2题：按照dept_no进行汇总</h3><p><strong>题目描述：</strong> 按照dept_no进行汇总，属于同一个部门的emp_no按照逗号进行连接，结果给出dept_no以及连接出的结果employees。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> dept_emp (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, dept_no)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">dept_no    employees</span><br><span class="line">d001    10001,10002</span><br><span class="line">d002    10006</span><br><span class="line">d003    10005</span><br><span class="line">d004    10003,10004</span><br><span class="line">d005    10007,10008,10010</span><br><span class="line">d006    10009,10010</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> dept_no, GROUP_CONCAT(emp_no <span class="keyword">ORDER</span> <span class="keyword">BY</span> emp_no SEPARATOR <span class="string">&#x27;,&#x27;</span>) <span class="keyword">AS</span> employees</span><br><span class="line"><span class="keyword">FROM</span> dept_emp</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> dept_no</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> dept_no;</span><br></pre></td></tr></table></figure><hr><h3 id="第3题：获取employees中的first-name">第3题：获取Employees中的first_name</h3><p><strong>题目描述：</strong> 获取Employees中的first_name，查询按照first_name最后两个字母，按照升序进行排列。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> employees (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    birth_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    first_name <span class="type">varchar</span>(<span class="number">14</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    last_name <span class="type">varchar</span>(<span class="number">16</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    gender <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    hire_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> first_name <span class="keyword">FROM</span> employees</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="keyword">RIGHT</span>(first_name, <span class="number">2</span>) <span class="keyword">ASC</span>, first_name <span class="keyword">ASC</span>;</span><br></pre></td></tr></table></figure><hr><h3 id="第4题：查找最晚入职员工的所有信息">第4题：查找最晚入职员工的所有信息</h3><p><strong>题目描述：</strong> 查找最晚入职员工的所有信息。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> employees (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    birth_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    first_name <span class="type">varchar</span>(<span class="number">14</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    last_name <span class="type">varchar</span>(<span class="number">16</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    gender <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    hire_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">emp_no    birth_date    first_name    last_name    gender    hire_date</span><br><span class="line">10008    1958-02-19    Saniya    Kalloufi    M    1994-09-15</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> employees</span><br><span class="line"><span class="keyword">WHERE</span> hire_date <span class="operator">=</span> (<span class="keyword">SELECT</span> <span class="built_in">MAX</span>(hire_date) <span class="keyword">FROM</span> employees);</span><br></pre></td></tr></table></figure><hr><h3 id="第5题：查找所有员工入职时候的薪水情况">第5题：查找所有员工入职时候的薪水情况</h3><p><strong>题目描述：</strong> 查找所有员工入职时候的薪水情况，给出emp_no以及salary，并按照emp_no进行逆序。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> employees (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    birth_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    first_name <span class="type">varchar</span>(<span class="number">14</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    last_name <span class="type">varchar</span>(<span class="number">16</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    gender <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    hire_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> salaries (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    salary <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, from_date)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">emp_no    salary</span><br><span class="line">10011    25828</span><br><span class="line">...</span><br><span class="line">10001    60117</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> e.emp_no, s.salary</span><br><span class="line"><span class="keyword">FROM</span> employees e</span><br><span class="line"><span class="keyword">JOIN</span> salaries s</span><br><span class="line"><span class="keyword">ON</span> e.emp_no <span class="operator">=</span> s.emp_no <span class="keyword">AND</span> e.hire_date <span class="operator">=</span> s.from_date</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> e.emp_no <span class="keyword">DESC</span>;</span><br></pre></td></tr></table></figure><hr><h3 id="第6题：获取所有部门当前manager的当前薪水情况">第6题：获取所有部门当前manager的当前薪水情况</h3><p><strong>题目描述：</strong> 获取所有部门当前manager的当前薪水情况，给出dept_no, emp_no以及salary，当前表示to_date=‘9999-01-01’。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> dept_manager (</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, dept_no)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> salaries (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    salary <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, from_date)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">dept_no    emp_no    salary</span><br><span class="line">d001    10002    72527</span><br><span class="line">d004    10004    74057</span><br><span class="line">d003    10005    94692</span><br><span class="line">d002    10006    43311</span><br><span class="line">d006    10010    94409</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> dm.dept_no, dm.emp_no, s.salary</span><br><span class="line"><span class="keyword">FROM</span> dept_manager dm</span><br><span class="line"><span class="keyword">JOIN</span> salaries s</span><br><span class="line"><span class="keyword">ON</span> dm.emp_no <span class="operator">=</span> s.emp_no</span><br><span class="line"><span class="keyword">WHERE</span> dm.to_date <span class="operator">=</span> <span class="string">&#x27;9999-01-01&#x27;</span></span><br><span class="line"><span class="keyword">AND</span> s.to_date <span class="operator">=</span> <span class="string">&#x27;9999-01-01&#x27;</span>;</span><br></pre></td></tr></table></figure><hr><h3 id="第7题：获取所有员工当前的manager">第7题：获取所有员工当前的manager</h3><p><strong>题目描述：</strong> 获取所有员工当前的manager，如果当前的manager是自己的话结果不显示，当前表示to_date=‘9999-01-01’。结果第一列给出当前员工的emp_no，第二列给出其manager对应的manager_no。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> dept_emp (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, dept_no)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> dept_manager (</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, dept_no)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">emp_no    manager_no</span><br><span class="line">10001    10002</span><br><span class="line">10003    10004</span><br><span class="line">10009    10010</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> de.emp_no, dm.emp_no <span class="keyword">AS</span> manager_no</span><br><span class="line"><span class="keyword">FROM</span> dept_emp de</span><br><span class="line"><span class="keyword">JOIN</span> dept_manager dm</span><br><span class="line"><span class="keyword">ON</span> de.dept_no <span class="operator">=</span> dm.dept_no</span><br><span class="line"><span class="keyword">WHERE</span> de.to_date <span class="operator">=</span> <span class="string">&#x27;9999-01-01&#x27;</span></span><br><span class="line"><span class="keyword">AND</span> dm.to_date <span class="operator">=</span> <span class="string">&#x27;9999-01-01&#x27;</span></span><br><span class="line"><span class="keyword">AND</span> de.emp_no <span class="operator">&lt;&gt;</span> dm.emp_no</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> de.emp_no;</span><br></pre></td></tr></table></figure><hr><h3 id="第8题：针对actor表创建视图actor-name-view">第8题：针对actor表创建视图actor_name_view</h3><p><strong>题目描述：</strong> 针对actor表创建视图actor_name_view，只包含first_name以及last_name两列，并对这两列重新命名，first_name为first_name_v，last_name修改为last_name_v。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> IF <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> actor (</span><br><span class="line">    actor_id <span class="type">smallint</span>(<span class="number">5</span>) <span class="keyword">NOT NULL</span> <span class="keyword">PRIMARY KEY</span>,</span><br><span class="line">    first_name <span class="type">varchar</span>(<span class="number">45</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    last_name <span class="type">varchar</span>(<span class="number">45</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    last_update <span class="type">timestamp</span> <span class="keyword">NOT NULL</span> <span class="keyword">DEFAULT</span> (datetime(<span class="string">&#x27;now&#x27;</span>,<span class="string">&#x27;localtime&#x27;</span>))</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> actor_name_view <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> first_name <span class="keyword">AS</span> first_name_v, last_name <span class="keyword">AS</span> last_name_v</span><br><span class="line"><span class="keyword">FROM</span> actor;</span><br></pre></td></tr></table></figure><hr><h3 id="第9题：统计各个部门对应员工涨幅的次数总和">第9题：统计各个部门对应员工涨幅的次数总和</h3><p><strong>题目描述：</strong> 统计各个部门对应员工涨幅的次数总和，给出部门编码dept_no、部门名称dept_name以及次数sum。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> departments (</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    dept_name <span class="type">varchar</span>(<span class="number">40</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (dept_no)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> dept_emp (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    dept_no <span class="type">char</span>(<span class="number">4</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, dept_no)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> salaries (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    salary <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, from_date)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">dept_no    dept_name    sum</span><br><span class="line">d001    Marketing    24</span><br><span class="line">d002    Finance    14</span><br><span class="line">d003    Human Resources    13</span><br><span class="line">d004    Production    24</span><br><span class="line">d005    Development    25</span><br><span class="line">d006    Quality Management    25</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> d.dept_no, d.dept_name, <span class="built_in">COUNT</span>(s.salary) <span class="keyword">AS</span> sum</span><br><span class="line"><span class="keyword">FROM</span> departments d</span><br><span class="line"><span class="keyword">JOIN</span> dept_emp de <span class="keyword">ON</span> d.dept_no <span class="operator">=</span> de.dept_no</span><br><span class="line"><span class="keyword">JOIN</span> salaries s <span class="keyword">ON</span> de.emp_no <span class="operator">=</span> s.emp_no</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> d.dept_no, d.dept_name</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> d.dept_no;</span><br></pre></td></tr></table></figure><hr><h3 id="第10题：统计出当前各个title类型对应的员工当前薪水对应的平均工资">第10题：统计出当前各个title类型对应的员工当前薪水对应的平均工资</h3><p><strong>题目描述：</strong> 统计出各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。</p><p><strong>表结构：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> salaries (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    salary <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    <span class="keyword">PRIMARY KEY</span> (emp_no, from_date)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> IF <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> titles (</span><br><span class="line">    emp_no <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    title <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    from_date <span class="type">date</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    to_date <span class="type">date</span> <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>输出格式：</strong></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">title    avg</span><br><span class="line">Engineer    94409.0</span><br><span class="line">Senior Engineer    69009.2</span><br><span class="line">Senior Staff    91381.0</span><br><span class="line">Staff    72527.0</span><br></pre></td></tr></table></figure><p><strong>答案：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> t.title, <span class="built_in">AVG</span>(s.salary) <span class="keyword">AS</span> avg</span><br><span class="line"><span class="keyword">FROM</span> titles t</span><br><span class="line"><span class="keyword">JOIN</span> salaries s</span><br><span class="line"><span class="keyword">ON</span> t.emp_no <span class="operator">=</span> s.emp_no</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> t.title</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> t.title;</span><br></pre></td></tr></table></figure><hr><h2 id="知识点总结">知识点总结</h2><h3 id="常用sql函数">常用SQL函数</h3><table><thead><tr><th>函数</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td>GROUP_CONCAT()</td><td>将分组中的值连接成字符串</td><td><code>GROUP_CONCAT(emp_no SEPARATOR ',')</code></td></tr><tr><td>COUNT()</td><td>统计行数</td><td><code>COUNT(*)</code> 或 <code>COUNT(column)</code></td></tr><tr><td>AVG()</td><td>计算平均值</td><td><code>AVG(salary)</code></td></tr><tr><td>MAX()</td><td>获取最大值</td><td><code>MAX(hire_date)</code></td></tr><tr><td>RIGHT()</td><td>从右侧截取字符串</td><td><code>RIGHT(first_name, 2)</code></td></tr></tbody></table><h3 id="join连接类型">JOIN连接类型</h3><table><thead><tr><th>类型</th><th>说明</th></tr></thead><tbody><tr><td>INNER JOIN</td><td>返回两表中匹配的行</td></tr><tr><td>LEFT JOIN</td><td>返回左表所有行，右表匹配的行</td></tr><tr><td>RIGHT JOIN</td><td>返回右表所有行，左表匹配的行</td></tr></tbody></table><h3 id="sql执行顺序">SQL执行顺序</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT</span><br></pre></td></tr></table></figure><h3 id="视图操作">视图操作</h3><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 创建视图</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> view_name <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> column1, column2 <span class="keyword">FROM</span> table_name;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除视图</span></span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">VIEW</span> view_name;</span><br></pre></td></tr></table></figure><h3 id="子查询使用场景">子查询使用场景</h3><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- WHERE中使用子查询</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> employees</span><br><span class="line"><span class="keyword">WHERE</span> hire_date <span class="operator">=</span> (<span class="keyword">SELECT</span> <span class="built_in">MAX</span>(hire_date) <span class="keyword">FROM</span> employees);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- IN中使用子查询</span></span><br><span class="line"><span class="keyword">UPDATE</span> salaries <span class="keyword">SET</span> salary <span class="operator">=</span> salary <span class="operator">*</span> <span class="number">1.1</span></span><br><span class="line"><span class="keyword">WHERE</span> emp_no <span class="keyword">IN</span> (<span class="keyword">SELECT</span> emp_no <span class="keyword">FROM</span> emp_bonus);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;数据库第三章编程作业答案&quot;&gt;数据库第三章编程作业答案&lt;/h1&gt;
&lt;p&gt;数据库第三章编程作业，共 &lt;strong&gt;10道SQL评测题&lt;/strong&gt;，涵盖UPDATE、GROUP_CONCAT、ORDER</summary>
        
      
    
    
    
    <category term="数据库" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="课程作业" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%AF%BE%E7%A8%8B%E4%BD%9C%E4%B8%9A/"/>
    
    
    <category term="MySQL" scheme="https://college-github-io.pages.dev/tags/MySQL/"/>
    
    <category term="数据库原理" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/"/>
    
    <category term="SQL语言" scheme="https://college-github-io.pages.dev/tags/SQL%E8%AF%AD%E8%A8%80/"/>
    
    <category term="课后习题" scheme="https://college-github-io.pages.dev/tags/%E8%AF%BE%E5%90%8E%E4%B9%A0%E9%A2%98/"/>
    
    <category term="编程题" scheme="https://college-github-io.pages.dev/tags/%E7%BC%96%E7%A8%8B%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>数据库第三章基础作业答案</title>
    <link href="https://college-github-io.pages.dev/posts/3fbe8927/"/>
    <id>https://college-github-io.pages.dev/posts/3fbe8927/</id>
    <published>2026-05-20T06:39:00.000Z</published>
    <updated>2026-05-20T06:39:53.101Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数据库第三章基础作业答案">数据库第三章基础作业答案</h1><p>数据库第三章基础作业，共 <strong>25道单选题</strong>，涵盖SQL语言基础、数据定义、数据查询、视图操作、索引等核心知识点。</p><hr><h2 id="答案速查表">答案速查表</h2><table><thead><tr><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">D</td><td style="text-align:center">10</td><td style="text-align:center">C</td><td style="text-align:center">19</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">C</td><td style="text-align:center">11</td><td style="text-align:center">C</td><td style="text-align:center">20</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">A</td><td style="text-align:center">12</td><td style="text-align:center">D</td><td style="text-align:center">21</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">B</td><td style="text-align:center">13</td><td style="text-align:center">B</td><td style="text-align:center">22</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">A</td><td style="text-align:center">14</td><td style="text-align:center">A</td><td style="text-align:center">23</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">A</td><td style="text-align:center">15</td><td style="text-align:center">D</td><td style="text-align:center">24</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">A</td><td style="text-align:center">16</td><td style="text-align:center">D</td><td style="text-align:center">25</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">C</td><td style="text-align:center">17</td><td style="text-align:center">A</td><td style="text-align:center"></td><td style="text-align:center"></td></tr><tr><td style="text-align:center">9</td><td style="text-align:center">C</td><td style="text-align:center">18</td><td style="text-align:center">C</td><td style="text-align:center"></td><td style="text-align:center"></td></tr></tbody></table><hr><h2 id="详细题目与答案">详细题目与答案</h2><h3 id="1-10题">1-10题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td>用下面的T-SQL语句建立的一个基本表…可以插入到表中的元组是（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">2</td><td>关于索引，选项中说法错误的是（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">3</td><td>SQL语言通常称为</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">4</td><td>select语句完整语法如下…则sql语句的执行顺序是：（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">5</td><td>在STUDENT表中按class_type统计数据行数分组情况后，筛选出数据行数为大于10行的组（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">6</td><td>为&quot;选手&quot;表增加一个字段&quot;最后得分&quot;的SQL语句是（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">7</td><td>在SQL语言中，用于测试列值非空的短语是（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">8</td><td>关于MySQL常见索引的描述正确是（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td>查询运动员表中运动员的所有信息，按照年龄升序，成绩降序排列。下列SQL语句正确的是（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">10</td><td>SQL中关于视图操作，错误的说法是（）</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="11-20题">11-20题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">11</td><td>SQL中，下列涉及空值的操作，不正确的是（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">12</td><td>SQL的特点表述错误的是 _____</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">13</td><td>SQL语言可以分为多个类别，那么不属于数据操纵语言DML的是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">14</td><td>DROP TABLE属于</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">15</td><td>下列关于视图说法错误的是？（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">16</td><td>下列子句中不可以与聚合函数一起使用的是（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">17</td><td>下面哪个不是sql的合法标识符（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">18</td><td>在视图上不能完成的操作是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">19</td><td>数据表的字段索引可以（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">20</td><td>SQL查询中使用Where子句指出的是（）</td><td style="text-align:center">D</td></tr></tbody></table><h3 id="21-25题">21-25题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">21</td><td>下列涉及空值的操作，不正确的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">22</td><td>当WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句同时出现在一个SQL查询语块中时，最后执行的（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">23</td><td>SQL语言中，条件&quot;年龄 BETWEEN 20 AND 30&quot;表示年龄在20至30之间，且（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">24</td><td>在下列的SQL语句中，属于数据控制的是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">25</td><td>检索销量表中销量最好的商品id和销量，下列SQL语句正确的是（）</td><td style="text-align:center">D</td></tr></tbody></table><hr><h2 id="知识点总结">知识点总结</h2><h3 id="sql语言分类">SQL语言分类</h3><table><thead><tr><th>分类</th><th style="text-align:center">缩写</th><th>主要语句</th></tr></thead><tbody><tr><td>数据定义语言</td><td style="text-align:center">DDL</td><td>CREATE、ALTER、DROP</td></tr><tr><td>数据操纵语言</td><td style="text-align:center">DML</td><td>INSERT、UPDATE、DELETE</td></tr><tr><td>数据查询语言</td><td style="text-align:center">DQL</td><td>SELECT</td></tr><tr><td>数据控制语言</td><td style="text-align:center">DCL</td><td>GRANT、REVOKE</td></tr></tbody></table><h3 id="select语句执行顺序">SELECT语句执行顺序</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY</span><br></pre></td></tr></table></figure><h3 id="空值判断">空值判断</h3><table><thead><tr><th>正确写法</th><th>错误写法</th></tr></thead><tbody><tr><td><code>IS NULL</code></td><td><code>= NULL</code></td></tr><tr><td><code>IS NOT NULL</code></td><td><code>!= NULL</code></td></tr></tbody></table><h3 id="索引相关">索引相关</h3><table><thead><tr><th>类型</th><th>说明</th></tr></thead><tbody><tr><td>普通索引</td><td>提高查询速度，允许重复值</td></tr><tr><td>唯一索引</td><td>索引列值必须唯一，允许空值</td></tr><tr><td>全文索引</td><td>用于全文检索</td></tr><tr><td>组合索引</td><td>遵循&quot;最左前缀&quot;原则</td></tr></tbody></table><p><strong>索引注意事项：</strong></p><ul><li>提高检索速度，但会降低写入性能</li><li>不是越多越好，应合理创建</li><li>应在经常查询或排序的列上创建</li></ul><h3 id="视图相关">视图相关</h3><ul><li>视图是虚表，只存储定义，不存储数据</li><li>可以在视图上进行查询、更新操作</li><li>删除视图用 <code>DROP VIEW</code>（不是DELETE VIEW）</li><li>更新视图时建议使用 <code>WITH CHECK OPTION</code></li></ul><h3 id="between-and">BETWEEN…AND…</h3><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">WHERE</span> 年龄 <span class="keyword">BETWEEN</span> <span class="number">20</span> <span class="keyword">AND</span> <span class="number">30</span></span><br><span class="line"><span class="comment">-- 等价于</span></span><br><span class="line"><span class="keyword">WHERE</span> 年龄 <span class="operator">&gt;=</span> <span class="number">20</span> <span class="keyword">AND</span> 年龄 <span class="operator">&lt;=</span> <span class="number">30</span></span><br><span class="line"><span class="comment">-- 包含边界值20和30</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;数据库第三章基础作业答案&quot;&gt;数据库第三章基础作业答案&lt;/h1&gt;
&lt;p&gt;数据库第三章基础作业，共 &lt;strong&gt;25道单选题&lt;/strong&gt;，涵盖SQL语言基础、数据定义、数据查询、视图操作、索引等核心知识点。&lt;/p&gt;
&lt;hr&gt;
&lt;h2</summary>
        
      
    
    
    
    <category term="数据库" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="课程作业" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%AF%BE%E7%A8%8B%E4%BD%9C%E4%B8%9A/"/>
    
    
    <category term="数据库原理" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/"/>
    
    <category term="SQL语言" scheme="https://college-github-io.pages.dev/tags/SQL%E8%AF%AD%E8%A8%80/"/>
    
    <category term="数据查询" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E6%9F%A5%E8%AF%A2/"/>
    
    <category term="视图" scheme="https://college-github-io.pages.dev/tags/%E8%A7%86%E5%9B%BE/"/>
    
    <category term="索引" scheme="https://college-github-io.pages.dev/tags/%E7%B4%A2%E5%BC%95/"/>
    
    <category term="课后习题" scheme="https://college-github-io.pages.dev/tags/%E8%AF%BE%E5%90%8E%E4%B9%A0%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>数据库第二四章作业答案</title>
    <link href="https://college-github-io.pages.dev/posts/e261cb1f/"/>
    <id>https://college-github-io.pages.dev/posts/e261cb1f/</id>
    <published>2026-05-20T03:00:00.000Z</published>
    <updated>2026-05-20T06:36:57.422Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数据库第二四章作业答案">数据库第二四章作业答案</h1><p>数据库第二章和第四章作业，共 <strong>50道单选题</strong>，涵盖关系代数、关系模型特征、完整性约束、数据库安全性（GRANT/REVOKE）等核心知识点。</p><hr><h2 id="答案速查表">答案速查表</h2><table><thead><tr><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">C</td><td style="text-align:center">14</td><td style="text-align:center">A</td><td style="text-align:center">27</td><td style="text-align:center">B</td><td style="text-align:center">40</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">C</td><td style="text-align:center">15</td><td style="text-align:center">D</td><td style="text-align:center">28</td><td style="text-align:center">A</td><td style="text-align:center">41</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">C</td><td style="text-align:center">16</td><td style="text-align:center">B</td><td style="text-align:center">29</td><td style="text-align:center">C</td><td style="text-align:center">42</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">C</td><td style="text-align:center">17</td><td style="text-align:center">D</td><td style="text-align:center">30</td><td style="text-align:center">C</td><td style="text-align:center">43</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">D</td><td style="text-align:center">18</td><td style="text-align:center">C</td><td style="text-align:center">31</td><td style="text-align:center">D</td><td style="text-align:center">44</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">D</td><td style="text-align:center">19</td><td style="text-align:center">D</td><td style="text-align:center">32</td><td style="text-align:center">D</td><td style="text-align:center">45</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">C</td><td style="text-align:center">20</td><td style="text-align:center">B</td><td style="text-align:center">33</td><td style="text-align:center">C</td><td style="text-align:center">46</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">C</td><td style="text-align:center">21</td><td style="text-align:center">B</td><td style="text-align:center">34</td><td style="text-align:center">A</td><td style="text-align:center">47</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td style="text-align:center">B</td><td style="text-align:center">22</td><td style="text-align:center">A</td><td style="text-align:center">35</td><td style="text-align:center">B</td><td style="text-align:center">48</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">10</td><td style="text-align:center">A</td><td style="text-align:center">23</td><td style="text-align:center">B</td><td style="text-align:center">36</td><td style="text-align:center">D</td><td style="text-align:center">49</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">11</td><td style="text-align:center">C</td><td style="text-align:center">24</td><td style="text-align:center">C</td><td style="text-align:center">37</td><td style="text-align:center">C</td><td style="text-align:center">50</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">12</td><td style="text-align:center">C</td><td style="text-align:center">25</td><td style="text-align:center">B</td><td style="text-align:center">38</td><td style="text-align:center">D</td><td style="text-align:center"></td><td style="text-align:center"></td></tr><tr><td style="text-align:center">13</td><td style="text-align:center">B</td><td style="text-align:center">26</td><td style="text-align:center">A</td><td style="text-align:center">39</td><td style="text-align:center">A</td><td style="text-align:center"></td><td style="text-align:center"></td></tr></tbody></table><hr><h2 id="详细题目与答案">详细题目与答案</h2><h3 id="1-10题">1-10题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td>语句GRANT、REVOKE实现了结构化查询语言的哪类功能（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">2</td><td>设关系R1、R2、R3各有5个元组，那么这三个关系的笛卡尔积的元组个数是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">3</td><td>在数据系统中，对存取权限的定义称为 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">4</td><td>下列哪个不是关系的特征</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">5</td><td>将查询 SC 表的权限授予用户，并允许该用户将此权限授予其他用户。实现此功能的 SQL 语句是 _____</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">6</td><td>学生、课程、学生与课程之间的多对多联系，三个模式如下…下列选项对于上述模式的参照完整性叙述不正确的是（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">7</td><td>设有如下所示的关系R和S，R÷S的正确结果是：</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">8</td><td>在学生关系中，要求每位学生的电话号码唯一，这属于 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td>某高校五个系的学生信息存放在同一个基本表中，采取 _____ 的措施可使各系的管理员只能读取本系学生的信息</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">10</td><td>相对于非关系模型，关系数据模型的缺点之一是</td><td style="text-align:center">A</td></tr></tbody></table><h3 id="11-20题">11-20题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">11</td><td>有如下3个关系…查询小明同学的成绩单(课号、课名、成绩)，其关系运算表达式为</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">12</td><td>常用的关系运算是关系代数和</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">13</td><td>假设创建新用户nkw，现在想对于任何IP的连接，仅拥有user数据库里面的select和insert权限，则列表语句中能够实现这一要求的语句是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">14</td><td>保护数据库，防止未经授权的或不合法的使用造成的数据泄露、更改破坏。这是指的 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">15</td><td>关系数据模型的三个组成部分中，不包括</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">16</td><td>假设创建新用户nkw，现在想对于任何IP的连接，仅拥有user数据库里面的select和insert权限，则列表语句中能够实现这一要求的语句是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">17</td><td>自然连接是构成新关系的有效方法。一般情况下，当对关系 R 和 S 使用自然连接时，要求 R和 S 含有一个或多个共有的</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">18</td><td>将表 SC 的删除权限授予用户user1，并允许该用户将此权限授予其他用户。实现此功能的 SQL 语句是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">19</td><td>某IT公司人事管理采用专门的人事管理系统来实现…作为LF的开发者你将如何解决这一问题：（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">20</td><td>假设创建新用户nkw，现在想对于任何IP的连接，仅拥有user数据库里面的select和insert权限，则列表语句中能够实现这一要求的语句是（）</td><td style="text-align:center">B</td></tr></tbody></table><h3 id="21-30题">21-30题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">21</td><td>假设有三个关系模式…要查询选修了&quot;数据库原理&quot;课程的学生学号、姓名、成绩，以下哪个关系代数表达式是正确的？</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">22</td><td>假设有关系R和S，关系代数表达式 R-(R-S) 表示的是 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">23</td><td>已知关系R和S，R∩S等价于（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">24</td><td>假设有三个关系模式…要查询&quot;小明&quot;同学的成绩单（课程号、课程名、成绩），以下哪个关系代数表达式是正确的？</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">25</td><td>为提高效率，关系数据库系统必须进行（）处理</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">26</td><td>已知数据库学生成绩及学生表，现授予用户USER1在学生表上的SELECT权限，下列SQL语句正确的是（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">27</td><td>在关系代数中，对一个关系做投影操作后，新关系的元组个数（）原来关系的元组个数</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">28</td><td>关系R和S属于不同的关系模式，而且属性列的数量不等，不能进行的操作是 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">29</td><td>在关系模型中，实现&quot;表示了两个关系之间的相关联系&quot;的约束是通过（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">30</td><td>下面对于关系的叙述中，不正确的是（）</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="31-40题">31-40题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">31</td><td>下列叙述正确的为</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">32</td><td>下面对关系&quot;键&quot;概念的不正确叙述是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">33</td><td>在数据库的表定义中，限制成绩属性列的取值在0到100的范围内，属于数据的（）约束</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">34</td><td>表中每个字段表示同类信息，这些数据具有相同的 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">35</td><td>关系代数表达式的优化策略中，首先要做的是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">36</td><td>关系数据库中的关键字是指（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">37</td><td>在基本关系中，下列说法正确的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">38</td><td>某IT公司人事管理采用专门的人事管理系统来实现…作为LF的开发者你将如何解决这一问题：（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">39</td><td>同一个关系模型的任意两个元组值</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">40</td><td>一个关系中的候选关键字</td><td style="text-align:center">B</td></tr></tbody></table><h3 id="41-50题">41-50题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">41</td><td>关系运算中花费时间可能最长的运算是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">42</td><td>在关系数据库设计中，关系模式是用来记录用户数据的（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">43</td><td>有关关系的特征表述错误的是 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">44</td><td>下面对&quot;关系模型&quot;的叙述中，不正确的说法是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">45</td><td>下列 SQL 语句中，能够实现&quot;收回用户 U4 对学生表(STUD)中学号(XH)的修改权&quot;这一功能的是( _____ ）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">46</td><td>下列关系运算中，（）运算不属于专门的关系运算</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">47</td><td>有一个关系：学生（学号，姓名，系别），规定学号的值域是 8 个数字组成的字符串，这一规则属于</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">48</td><td>授权编译系统和合法性检查机制一起组成了 _____ 子系统</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">49</td><td>与关系模式 S(A,B,C,D)的代数运算δ3≤’2’(S)等价的 SQL 语句是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">50</td><td>下面关于关系代数的不正确叙述是</td><td style="text-align:center">A</td></tr></tbody></table><hr><h2 id="知识点总结">知识点总结</h2><h3 id="关系代数基本运算">关系代数基本运算</h3><table><thead><tr><th>运算</th><th style="text-align:center">符号</th><th>说明</th></tr></thead><tbody><tr><td>选择</td><td style="text-align:center">σ</td><td>按条件筛选行（水平方向）</td></tr><tr><td>投影</td><td style="text-align:center">π</td><td>选择列（垂直方向）</td></tr><tr><td>并</td><td style="text-align:center">∪</td><td>合并两个关系</td></tr><tr><td>差</td><td style="text-align:center">-</td><td>R中有的但S中没有的</td></tr><tr><td>笛卡尔积</td><td style="text-align:center">×</td><td>所有可能的元组组合</td></tr></tbody></table><h3 id="专门的关系运算">专门的关系运算</h3><table><thead><tr><th>运算</th><th>说明</th></tr></thead><tbody><tr><td>自然连接 ⨝</td><td>基于相同属性名的连接，去除重复列</td></tr><tr><td>除 ÷</td><td>找出与另一个关系所有元组都关联的元组</td></tr><tr><td>交 ∩</td><td>R∩S = R - (R - S)</td></tr></tbody></table><h3 id="完整性约束">完整性约束</h3><table><thead><tr><th>类型</th><th>说明</th></tr></thead><tbody><tr><td>实体完整性</td><td>主码不能为空（NOT NULL）</td></tr><tr><td>参照完整性</td><td>外键必须引用存在的主键或为空</td></tr><tr><td>用户自定义完整性</td><td>用户定义的约束（如CHECK、UNIQUE）</td></tr></tbody></table><h3 id="数据库安全性-dcl">数据库安全性（DCL）</h3><table><thead><tr><th>语句</th><th>功能</th></tr></thead><tbody><tr><td>GRANT</td><td>授权</td></tr><tr><td>REVOKE</td><td>收回权限</td></tr><tr><td>WITH GRANT OPTION</td><td>允许被授权用户将权限转授给其他用户</td></tr></tbody></table><p><strong>授权语法：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">GRANT</span> <span class="operator">&lt;</span>权限<span class="operator">&gt;</span> <span class="keyword">ON</span> <span class="operator">&lt;</span>表<span class="operator">&gt;</span> <span class="keyword">TO</span> <span class="operator">&lt;</span>用户<span class="operator">&gt;</span> [<span class="keyword">WITH</span> <span class="keyword">GRANT</span> OPTION];</span><br></pre></td></tr></table></figure><p><strong>收回权限语法：</strong></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">REVOKE</span> <span class="operator">&lt;</span>权限<span class="operator">&gt;</span> <span class="keyword">ON</span> <span class="operator">&lt;</span>表<span class="operator">&gt;</span> <span class="keyword">FROM</span> <span class="operator">&lt;</span>用户<span class="operator">&gt;</span>;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;数据库第二四章作业答案&quot;&gt;数据库第二四章作业答案&lt;/h1&gt;
&lt;p&gt;数据库第二章和第四章作业，共</summary>
        
      
    
    
    
    <category term="数据库" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="课程作业" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%AF%BE%E7%A8%8B%E4%BD%9C%E4%B8%9A/"/>
    
    
    <category term="数据库原理" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/"/>
    
    <category term="课后习题" scheme="https://college-github-io.pages.dev/tags/%E8%AF%BE%E5%90%8E%E4%B9%A0%E9%A2%98/"/>
    
    <category term="SQL" scheme="https://college-github-io.pages.dev/tags/SQL/"/>
    
    <category term="关系代数" scheme="https://college-github-io.pages.dev/tags/%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0/"/>
    
    <category term="数据安全" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>数据库第一章作业答案</title>
    <link href="https://college-github-io.pages.dev/posts/5fe7582e/"/>
    <id>https://college-github-io.pages.dev/posts/5fe7582e/</id>
    <published>2026-05-20T02:00:00.000Z</published>
    <updated>2026-05-20T06:21:05.346Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数据库第一章作业答案">数据库第一章作业答案</h1><p>数据库第一章作业，共 <strong>100道单选题</strong>，涵盖数据库基本概念、数据模型、三级模式结构、数据独立性等核心知识点。</p><hr><h2 id="答案速查表">答案速查表</h2><table><thead><tr><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th><th style="text-align:center">题号</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">B</td><td style="text-align:center">26</td><td style="text-align:center">B</td><td style="text-align:center">51</td><td style="text-align:center">C</td><td style="text-align:center">76</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">B</td><td style="text-align:center">27</td><td style="text-align:center">B</td><td style="text-align:center">52</td><td style="text-align:center">A</td><td style="text-align:center">77</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">C</td><td style="text-align:center">28</td><td style="text-align:center">C</td><td style="text-align:center">53</td><td style="text-align:center">B</td><td style="text-align:center">78</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">B</td><td style="text-align:center">29</td><td style="text-align:center">C</td><td style="text-align:center">54</td><td style="text-align:center">B</td><td style="text-align:center">79</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">D</td><td style="text-align:center">30</td><td style="text-align:center">D</td><td style="text-align:center">55</td><td style="text-align:center">C</td><td style="text-align:center">80</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">D</td><td style="text-align:center">31</td><td style="text-align:center">B</td><td style="text-align:center">56</td><td style="text-align:center">B</td><td style="text-align:center">81</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">B</td><td style="text-align:center">32</td><td style="text-align:center">C</td><td style="text-align:center">57</td><td style="text-align:center">C</td><td style="text-align:center">82</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">C</td><td style="text-align:center">33</td><td style="text-align:center">A</td><td style="text-align:center">58</td><td style="text-align:center">D</td><td style="text-align:center">83</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td style="text-align:center">A</td><td style="text-align:center">34</td><td style="text-align:center">A</td><td style="text-align:center">59</td><td style="text-align:center">A</td><td style="text-align:center">84</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">10</td><td style="text-align:center">C</td><td style="text-align:center">35</td><td style="text-align:center">A</td><td style="text-align:center">60</td><td style="text-align:center">C</td><td style="text-align:center">85</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">11</td><td style="text-align:center">D</td><td style="text-align:center">36</td><td style="text-align:center">C</td><td style="text-align:center">61</td><td style="text-align:center">A</td><td style="text-align:center">86</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">12</td><td style="text-align:center">B</td><td style="text-align:center">37</td><td style="text-align:center">C</td><td style="text-align:center">62</td><td style="text-align:center">D</td><td style="text-align:center">87</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">13</td><td style="text-align:center">D</td><td style="text-align:center">38</td><td style="text-align:center">C</td><td style="text-align:center">63</td><td style="text-align:center">C</td><td style="text-align:center">88</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">14</td><td style="text-align:center">C</td><td style="text-align:center">39</td><td style="text-align:center">C</td><td style="text-align:center">64</td><td style="text-align:center">B</td><td style="text-align:center">89</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">15</td><td style="text-align:center">B</td><td style="text-align:center">40</td><td style="text-align:center">D</td><td style="text-align:center">65</td><td style="text-align:center">D</td><td style="text-align:center">90</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">16</td><td style="text-align:center">A</td><td style="text-align:center">41</td><td style="text-align:center">A</td><td style="text-align:center">66</td><td style="text-align:center">D</td><td style="text-align:center">91</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">17</td><td style="text-align:center">D</td><td style="text-align:center">42</td><td style="text-align:center">C</td><td style="text-align:center">67</td><td style="text-align:center">D</td><td style="text-align:center">92</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">18</td><td style="text-align:center">A</td><td style="text-align:center">43</td><td style="text-align:center">C</td><td style="text-align:center">68</td><td style="text-align:center">A</td><td style="text-align:center">93</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">19</td><td style="text-align:center">A</td><td style="text-align:center">44</td><td style="text-align:center">D</td><td style="text-align:center">69</td><td style="text-align:center">D</td><td style="text-align:center">94</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">20</td><td style="text-align:center">C</td><td style="text-align:center">45</td><td style="text-align:center">A</td><td style="text-align:center">70</td><td style="text-align:center">C</td><td style="text-align:center">95</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">21</td><td style="text-align:center">C</td><td style="text-align:center">46</td><td style="text-align:center">C</td><td style="text-align:center">71</td><td style="text-align:center">A</td><td style="text-align:center">96</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">22</td><td style="text-align:center">D</td><td style="text-align:center">47</td><td style="text-align:center">C</td><td style="text-align:center">72</td><td style="text-align:center">C</td><td style="text-align:center">97</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">23</td><td style="text-align:center">C</td><td style="text-align:center">48</td><td style="text-align:center">A</td><td style="text-align:center">73</td><td style="text-align:center">C</td><td style="text-align:center">98</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">24</td><td style="text-align:center">C</td><td style="text-align:center">49</td><td style="text-align:center">C</td><td style="text-align:center">74</td><td style="text-align:center">B</td><td style="text-align:center">99</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">25</td><td style="text-align:center">A</td><td style="text-align:center">50</td><td style="text-align:center">D</td><td style="text-align:center">75</td><td style="text-align:center">B</td><td style="text-align:center">100</td><td style="text-align:center">C</td></tr></tbody></table><hr><h2 id="详细题目与答案">详细题目与答案</h2><h3 id="1-10题">1-10题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td>子模式 DDL 用来描述（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">2</td><td>设有部门和职员两个实体，每个职员只能属于一个部门，一个部门可以有多名职员，则部门与职员实体之间的联系类型()</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">3</td><td>位于用户和操作系统之间的一层数据管理软件指的是（）？</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">4</td><td>数据库 DB、数据库管理系统 DBMS 和数据库系统 DBS 之间的关系是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">5</td><td>数据模型通常由 _____ 三要素构成</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">6</td><td>反映现实世界中实体及实体间联系的信息模型是()？</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">7</td><td>下列关于数据库系统三级模式结构的表述正确的是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">8</td><td>物理数据独立性是指</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">9</td><td>数据库管理系统能实现对数据库中数据表、索引等对象的定义、修改、删除，这类语言称为</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">10</td><td>在关系模式中，对应关系的主键必须是 ()</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="11-20题">11-20题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">11</td><td>关系数据模型的三个组成部分中，不包括（）</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">12</td><td>要保证数据库物理数据独立性，需要修改的是 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">13</td><td>下列四项中，不属于数据库系统的主要特点的是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">14</td><td>要保证数据库逻辑数据独立性，需要修改的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">15</td><td>DBMS是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">16</td><td>数据库三级模式体系结构的划分，有利于保持数据库的</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">17</td><td>不属于DBA职责的是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">18</td><td>ER图属于下列哪种模型 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">19</td><td>数据库系统中,用户使用的数据视图用（）描述，它是用户与数据库系统之间的接口</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">20</td><td>文件系统与数据库系统的最大区别是</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="21-30题">21-30题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">21</td><td>在DBS中，逻辑数据与物理数据之间可以差别很大，实现两者之间转换工作的是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">22</td><td>学生社团可以接纳多名学生参加，但每个学生只能参加一个社团，从社团到学生之间的联系类型是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">23</td><td>文件系统与数据库系统的最大区别是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">24</td><td>下面哪个不是数据库系统必须提供的数据控制功能 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">25</td><td>单个用户使用的数据视图的描述称为</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">26</td><td>在基本层次联系中，记录型之间的联系是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">27</td><td>有关数据库系统的特点表述错误的是 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">28</td><td>数据模型指的是数据库的组织形式，数据模型的三要素是（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">29</td><td>MySQL属于 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">30</td><td>下列四项中，不属于数据库系统的主要特点的是（）</td><td style="text-align:center">D</td></tr></tbody></table><h3 id="31-40题">31-40题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">31</td><td>概念模型是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">32</td><td>数据库（DB）、数据库系统（DBS）和数据库管理系统（DBMS）三者之间的关系是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">33</td><td>层次模型不能表示（）的联系</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">34</td><td>对数据库物理存储方式的描述称为()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">35</td><td>常见的数据模型是（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">36</td><td>下面对数据库特点的不正确叙述是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">37</td><td>数据的逻辑独立性是指（）</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">38</td><td>数据的逻辑独立性是指</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">39</td><td>给用户授权属于数据库管理系统的什么功能 _____ ？</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">40</td><td>数据库系统阶段，数据__________________（）</td><td style="text-align:center">D</td></tr></tbody></table><h3 id="41-50题">41-50题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">41</td><td>数据库三级模式体系结构的划分，有利于保持数据库的 ()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">42</td><td>下面对数据库三级模式结构的叙述中，不正确的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">43</td><td>物理数据独立性是指</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">44</td><td>反映现实世界中实体及实体间联系的信息模型是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">45</td><td>下列关于数据库系统的正确叙述是（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">46</td><td>MySQL是一种（）数据库管理系统</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">47</td><td>关于冗余数据的叙述中，不正确的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">48</td><td>按照所使用的数据模型来分，数据库可分为哪三种模型？（）</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">49</td><td>数据库系统的体系结构是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">50</td><td>在数据库的三级模式结构中，描述数据库中全体数据的全局逻辑结构和特征的是</td><td style="text-align:center">D</td></tr></tbody></table><h3 id="51-60题">51-60题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">51</td><td>下列四项中，不属于数据库特点的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">52</td><td>数据库三级模式的划分,有利于</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">53</td><td>数据库系统的核心是（）</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">54</td><td>要保证数据库物理数据独立性,需要修改的是</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">55</td><td>数据库管理系统（DBMS）是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">56</td><td>数据库系统与文件系统的主要区别是 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">57</td><td>数据库管理系统能实现对数据库中数据的查询、插入、修改和删除等操作，这种功能称为</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">58</td><td>数据模型的三要素包括 _____</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">59</td><td>在实体联系模型（ER模型）中，以下哪个元素用于表示现实世界中具有相同属性集的一类对象 _____ ？</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">60</td><td>应用数据库的主要目的是为了</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="61-70题">61-70题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">61</td><td>下列不属于DBA职责的是</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">62</td><td>保证数据库中的数据的逻辑独立性，需要修改的是</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">63</td><td>以下四项中，不属于数据库系统特点的是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">64</td><td>数据库通常是指有组织地、动态地存储在 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">65</td><td>数据库管理系统（DBMS）是 _____</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">66</td><td>应用数据库的主要目的是解决数据()问题</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">67</td><td>关系数据模型()</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">68</td><td>在数据库中，下列说法()是不正确的</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">69</td><td>下述()不是DBA数据库管理员的职责</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">70</td><td>数据库管理系统与操作系统、应用软件的层次关系从核心到外围依次是 _____</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="71-80题">71-80题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">71</td><td>要保证数据库的逻辑数据独立性，需要修改的是</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">72</td><td>在数据库三级模式中，模式和内模式()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">73</td><td>DBMS是 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">74</td><td>()的存取路径对用户透明，从而具有更高的数据独立性、更好的安全保密性，也简化了程序员的工作和数据库开发建立的工作</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">75</td><td>对现实世界进行第一层抽象和第二层抽象的模型称为 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">76</td><td>在数据库中存储的是()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">77</td><td>数据库系统的数据独立性体现在()</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">78</td><td>在数据库的非关系模型中，基本层次联系是()</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">79</td><td>下列关于E-R模型的说法中，正确的是</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">80</td><td>要保证数据库的数据独立性，需要修改的是()</td><td style="text-align:center">C</td></tr></tbody></table><h3 id="81-90题">81-90题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">81</td><td>实体是信息世界中的术语，与之对应的数据库术语为()</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">82</td><td>提供数据库定义、数据操纵、数据控制和数据库维护功能的软件称为 _____</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">83</td><td>下面给出的叙述中，不属于DBA职责的是()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">84</td><td>数据库系统的核心的是 _____</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">85</td><td>数据库的概念模型独立于()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">86</td><td>子模式DDL用来描述()</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">87</td><td>在下列四种模型中，与计算机的硬件及软件均无关的是()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">88</td><td>数据库管理系统中用于定义和描述数据库逻辑结构的语言称为()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">89</td><td>数据库（DB），数据库系统（DBS）和数据库管理系统（DBMS）之间的关系是 _____</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">90</td><td>用户或应用程序看到的那部分局部逻辑结构和特征的描述是()模式</td><td style="text-align:center">D</td></tr></tbody></table><h3 id="91-100题">91-100题</h3><table><thead><tr><th style="text-align:center">题号</th><th>题目</th><th style="text-align:center">答案</th></tr></thead><tbody><tr><td style="text-align:center">91</td><td>下述关于数据库系统的正确叙述是()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">92</td><td>下列关于数据冗余的叙述中，不正确的是()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">93</td><td>按所使用的数据模型来分，数据库可分为()三种模型</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">94</td><td>概念模型独立于()</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">95</td><td>_____ 是存储在计算机内有结构的数据的集合</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">96</td><td>一个数据库系统必须能够表示实体和关系，关系可与()实体有关</td><td style="text-align:center">D</td></tr><tr><td style="text-align:center">97</td><td>子模式是()</td><td style="text-align:center">B</td></tr><tr><td style="text-align:center">98</td><td>关系模型的程序员不需熟悉数据库的()</td><td style="text-align:center">C</td></tr><tr><td style="text-align:center">99</td><td>在数据管理技术的发展过程中，经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中，数据独立性最高的是()阶段</td><td style="text-align:center">A</td></tr><tr><td style="text-align:center">100</td><td>数据库管理系统是 _____</td><td style="text-align:center">C</td></tr></tbody></table><hr><h2 id="知识点总结">知识点总结</h2><h3 id="核心概念">核心概念</h3><ul><li><strong>DB（数据库）</strong>：存储在计算机内有结构的数据集合</li><li><strong>DBMS（数据库管理系统）</strong>：位于用户与OS之间的数据管理软件</li><li><strong>DBS（数据库系统）</strong>：包括DB、DBMS、DBA、应用程序等</li></ul><h3 id="三级模式结构">三级模式结构</h3><table><thead><tr><th>模式</th><th>说明</th></tr></thead><tbody><tr><td>外模式</td><td>用户看到的局部数据视图（子模式）</td></tr><tr><td>模式</td><td>全局逻辑结构（只有一个）</td></tr><tr><td>内模式</td><td>物理存储方式（只有一个）</td></tr></tbody></table><h3 id="数据独立性">数据独立性</h3><ul><li><strong>逻辑独立性</strong>：模式改变，外模式和应用程序不变（修改外模式/模式映射）</li><li><strong>物理独立性</strong>：内模式改变，模式不变（修改模式/内模式映射）</li></ul><h3 id="数据模型三要素">数据模型三要素</h3><ol><li>数据结构</li><li>数据操作</li><li>完整性约束</li></ol>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;数据库第一章作业答案&quot;&gt;数据库第一章作业答案&lt;/h1&gt;
&lt;p&gt;数据库第一章作业，共 &lt;strong&gt;100道单选题&lt;/strong&gt;，涵盖数据库基本概念、数据模型、三级模式结构、数据独立性等核心知识点。&lt;/p&gt;
&lt;hr&gt;
&lt;h2</summary>
        
      
    
    
    
    <category term="数据库" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="课程作业" scheme="https://college-github-io.pages.dev/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%AF%BE%E7%A8%8B%E4%BD%9C%E4%B8%9A/"/>
    
    
    <category term="数据库原理" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%9F%E7%90%86/"/>
    
    <category term="课后习题" scheme="https://college-github-io.pages.dev/tags/%E8%AF%BE%E5%90%8E%E4%B9%A0%E9%A2%98/"/>
    
    <category term="SQL" scheme="https://college-github-io.pages.dev/tags/SQL/"/>
    
  </entry>
  
  <entry>
    <title>用 Web 技术做一套数据结构微课</title>
    <link href="https://college-github-io.pages.dev/posts/941bb484/"/>
    <id>https://college-github-io.pages.dev/posts/941bb484/</id>
    <published>2026-05-06T13:30:00.000Z</published>
    <updated>2026-05-06T14:31:05.414Z</updated>
    
    <content type="html"><![CDATA[<h1 id="用-web-技术做一套数据结构微课：从知识点到可发布视频">用 Web 技术做一套数据结构微课：从知识点到可发布视频</h1><blockquote><p>本文记录《数据结构微课》项目的技术设计与制作流程。项目成片已发布到：</p><ul><li>B 站：<a href="https://www.bilibili.com/video/BV1PNRxB7EWq/">https://www.bilibili.com/video/BV1PNRxB7EWq/</a></li><li>抖音：<a href="https://www.douyin.com/video/7636641569991573426">https://www.douyin.com/video/7636641569991573426</a></li></ul><p>项目代码计划开源在 GitHub：<a href="https://github.com/haodehaode378/video-pipeline%E3%80%82%E7%9B%AE%E5%89%8D%E9%A1%B9%E7%9B%AE%E4%BB%8D%E5%A4%84%E4%BA%8E%E5%BC%80%E5%8F%91%E5%92%8C%E6%95%B4%E7%90%86%E9%98%B6%E6%AE%B5%EF%BC%8C%E5%90%8E%E7%BB%AD%E4%BC%9A%E9%80%90%E6%AD%A5%E8%A1%A5%E5%85%85%E5%AE%8C%E6%95%B4%E7%9A%84%E6%BA%90%E7%A0%81%E3%80%81%E5%88%B6%E4%BD%9C%E8%84%9A%E6%9C%AC%E3%80%81%E7%A4%BA%E4%BE%8B%E5%B7%A5%E7%A8%8B%E5%92%8C%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E3%80%82">https://github.com/haodehaode378/video-pipeline。目前项目仍处于开发和整理阶段，后续会逐步补充完整的源码、制作脚本、示例工程和使用说明。</a></p></blockquote><h2 id="1-为什么用前端技术做微课视频">1. 为什么用前端技术做微课视频</h2><p>数据结构的难点不在于定义本身，而在于学生很难在静态文字里看清“状态如何变化”。例如顺序表插入时元素为什么要移动，链表插入时指针为什么只改两条边，二叉树遍历为什么会得到不同序列，DFS 和 BFS 为什么访问顺序不同。</p><p>因此，这套微课没有采用传统 PPT 录屏，而是把每一节课拆成可编程的动画场景。核心思路是：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">知识点脚本 -&gt; HTML 场景 -&gt; CSS/JS 动画 -&gt; 浏览器预览 -&gt; 视频渲染 -&gt; 分段配音 -&gt; 音视频合成</span><br></pre></td></tr></table></figure><p>前端技术的优势在于可控。每一个节点、数组格、指针、栈顶标记、队头队尾标记都可以被精确定位和高亮；每一个时间点都能通过 URL 参数复现，便于截图检查和局部修正。</p><h2 id="2-内容结构：6-集覆盖核心脉络">2. 内容结构：6 集覆盖核心脉络</h2><p>这套微课按“先建立整体地图，再讲典型结构和操作”的顺序组织，共 6 集：</p><table><thead><tr><th>集数</th><th>主题</th><th>核心目标</th></tr></thead><tbody><tr><td>01</td><td>数据结构到底学什么</td><td>建立逻辑结构、存储结构、数据运算的总览</td></tr><tr><td>02</td><td>顺序表 vs 链表</td><td>对比连续存储和指针存储的访问、插入、删除差异</td></tr><tr><td>03</td><td>栈和队列</td><td>理解 LIFO、FIFO、top、front、rear 和循环队列</td></tr><tr><td>04</td><td>树与二叉树遍历</td><td>理解根、左右子树、先序、中序、后序、层次遍历</td></tr><tr><td>05</td><td>图：多对多关系与遍历</td><td>理解顶点、边、邻接矩阵、邻接表、DFS、BFS</td></tr><tr><td>06</td><td>查找与排序</td><td>理解顺序查找、二分查找、散列查找和常见排序思想</td></tr></tbody></table><p>每一集都遵循固定节奏：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">标题引入 -&gt; 概念解释 -&gt; 动画演示 -&gt; 关键代码/公式 -&gt; 一句话总结</span><br></pre></td></tr></table></figure><p>这样做的好处是学生每次打开视频都能预期学习路径：先知道这一集解决什么问题，再看到结构如何变化，最后用一小段代码或公式把图形过程落到实现层。</p><h2 id="3-工程结构：每集都是一个可运行网页">3. 工程结构：每集都是一个可运行网页</h2><p>项目将每一集放在独立目录中：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">videos/</span><br><span class="line">  01-overview/</span><br><span class="line">  02-linear-list/</span><br><span class="line">  03-stack-queue/</span><br><span class="line">  04-binary-tree/</span><br><span class="line">  05-graph/</span><br><span class="line">  06-search-sort/</span><br></pre></td></tr></table></figure><p>每集基本包含：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">index.html      # 控制台预览入口</span><br><span class="line">submit.html     # 干净提交/渲染入口</span><br><span class="line">style.css       # 视觉系统和动画样式</span><br><span class="line">script.js       # 时间轴、场景切换、状态更新</span><br><span class="line">assets/         # 分段旁白、音频等素材</span><br><span class="line">output/         # 导出视频</span><br><span class="line">snapshots/      # 关键帧截图</span><br></pre></td></tr></table></figure><p>这个目录设计有一个重要原则：<strong>课程内容、动画逻辑、配音素材和导出结果放在同一个 episode 边界内</strong>。这样第 3 集调整栈和队列时，不会影响第 4 集二叉树；第 5 集重新配音时，也不需要改全局工程配置。</p><p><code>index.html</code> 不是普通网页，而是一个固定比例的视频舞台。根节点会声明视频尺寸、总时长和 composition id：</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">main</span></span></span><br><span class="line"><span class="tag">  <span class="attr">id</span>=<span class="string">&quot;root&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">class</span>=<span class="string">&quot;stage&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">data-composition-id</span>=<span class="string">&quot;03-stack-queue&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">data-width</span>=<span class="string">&quot;1920&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">data-height</span>=<span class="string">&quot;1080&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">data-duration</span>=<span class="string">&quot;289.12&quot;</span></span></span><br><span class="line"><span class="tag">&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">main</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这里的 <code>data-width</code>、<code>data-height</code> 和 <code>data-duration</code> 不是装饰字段，而是后续预览、截图和渲染的统一协议：</p><ul><li>浏览器预览时，脚本按 1920x1080 等比缩放舞台，避免不同屏幕尺寸导致布局变形。</li><li>截图时，自动化工具读取同一个入口，通过 <code>?t=120</code> 定位到第 120 秒。</li><li>渲染时，导出脚本可以按 composition id 和 duration 推断视频范围。</li></ul><p>每个场景用 <code>section.scene</code> 表示，并通过 <code>data-start</code> 和 <code>data-duration</code> 标注时间范围：</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;scene scene-stack-push bg-yellow&quot;</span> <span class="attr">data-start</span>=<span class="string">&quot;78.90&quot;</span> <span class="attr">data-duration</span>=<span class="string">&quot;22.86&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h2</span>&gt;</span>进栈：先移动 top，再放入元素<span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line"><span class="tag">&lt;/<span class="name">section</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这种写法相当于把一条视频拆成多个“时间片”。每个时间片内部只关心自己的教学对象，例如栈场景只处理 <code>top</code> 指针和栈元素，队列场景只处理 <code>front</code>、<code>rear</code> 和数组格。相比把所有动画写在一个长函数里，这种结构更容易定位问题：某个画面错了，先看它属于哪个 <code>section.scene</code>，再看对应的局部时间计算。</p><p><code>submit.html</code> 则承担“干净渲染入口”的角色。开发阶段需要控制台、滑块、时间码，方便检查动画；正式提交或录制时，这些调试组件会干扰画面。因此项目保留两个入口：</p><table><thead><tr><th>入口</th><th>用途</th><th>特点</th></tr></thead><tbody><tr><td><code>index.html</code></td><td>开发预览</td><td>显示控制台、时间码、调试滑块</td></tr><tr><td><code>submit.html</code></td><td>截图/渲染/提交</td><td>隐藏调试 UI，只保留视频画面</td></tr></tbody></table><p>这样可以避免一个常见问题：为了临时录制把调试控件删掉，录完又要恢复。入口分离后，开发态和成片态各自稳定。</p><h2 id="4-时间轴设计：把视频变成可-seek-的状态机">4. 时间轴设计：把视频变成可 seek 的状态机</h2><p>微课动画最关键的不是“自动播放”，而是“任意时刻都能稳定复现画面”。项目里的 <code>script.js</code> 会暴露类似 <code>window.__hfSeek(time)</code> 的能力，用于把画面跳转到指定秒数。</p><p>这种设计解决了三个问题：</p><ol><li>预览时可以拖动时间轴，快速检查某一秒的布局。</li><li>截图时可以打开 <code>index.html?t=120</code>，直接定位关键帧。</li><li>渲染时可以逐帧推进，保证导出视频和浏览器预览一致。</li></ol><p>以第 3 集“栈和队列”为例，脚本中维护了旁白时间段、场景切换、元素高亮和控制台状态。栈的入栈、出栈，队列的 front/rear 移动，循环队列的取模回绕，都由当前时间计算出来，而不是依赖一次性播放动画。</p><p>核心实现可以概括成三步：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">updateScene</span>(<span class="params">time</span>) &#123;</span><br><span class="line">  scenes.<span class="title function_">forEach</span>(<span class="function">(<span class="params">scene</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> start = <span class="title class_">Number</span>(scene.<span class="property">dataset</span>.<span class="property">start</span>);</span><br><span class="line">    <span class="keyword">const</span> duration = <span class="title class_">Number</span>(scene.<span class="property">dataset</span>.<span class="property">duration</span>);</span><br><span class="line">    scene.<span class="property">classList</span>.<span class="title function_">toggle</span>(<span class="string">&quot;is-active&quot;</span>, time &gt;= start &amp;&amp; time &lt; start + duration);</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> pushLocal = <span class="title function_">sceneLocal</span>(<span class="string">&quot;.scene-stack-push&quot;</span>, time);</span><br><span class="line">  <span class="title function_">setLit</span>(<span class="string">&quot;.item-a&quot;</span>, pushLocal &gt;= <span class="number">2</span>, <span class="string">&quot;is-in&quot;</span>);</span><br><span class="line">  <span class="title function_">setLit</span>(<span class="string">&quot;.item-b&quot;</span>, pushLocal &gt;= <span class="number">6</span>, <span class="string">&quot;is-in&quot;</span>);</span><br><span class="line">  <span class="title function_">setLit</span>(<span class="string">&quot;.item-c&quot;</span>, pushLocal &gt;= <span class="number">10</span>, <span class="string">&quot;is-in&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>第一步是根据全局时间 <code>time</code> 找到当前场景。第二步是把全局时间转换成场景内部的局部时间，例如第 3 集入栈场景从 78.90 秒开始，那么全局 84.90 秒对应局部 6 秒。第三步是用局部时间切换 CSS class，让元素进入、离开、高亮或移动。</p><p>这里没有使用 <code>setTimeout</code> 串联动画，原因很直接：<code>setTimeout</code> 适合从头播放，但不适合跳到任意一帧。如果学生反馈“第 2 分 10 秒的 top 指针不对”，工程上应该能直接打开 <code>index.html?t=130</code> 复现，而不是从头播放等到那一刻。</p><p>项目实际采用的是“状态派生”思路：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">当前秒数</span><br><span class="line">  -&gt; 当前场景</span><br><span class="line">  -&gt; 场景局部时间</span><br><span class="line">  -&gt; DOM class 状态</span><br><span class="line">  -&gt; CSS 负责最终视觉表现</span><br></pre></td></tr></table></figure><p>这和很多前端 UI 的状态管理类似：不要记录“动画已经播放到哪一步”，而是每次根据当前时间重新计算“此刻应该是什么状态”。这样即使拖动进度条、刷新页面、自动截图或逐帧渲染，画面状态也能保持一致。</p><p>第 3 集里几个典型状态映射如下：</p><table><thead><tr><th>知识点</th><th>时间状态</th><th>画面状态</th></tr></thead><tbody><tr><td>顺序栈入栈</td><td><code>pushLocal &gt;= 2/6/10</code></td><td>A、B、C 依次添加 <code>is-in</code></td></tr><tr><td>栈顶变化</td><td><code>pushLocal</code> 落在不同区间</td><td><code>top</code> 指针添加 <code>at-a</code>、<code>at-b</code>、<code>at-c</code></td></tr><tr><td>出栈</td><td><code>popLocal &gt;= 4</code></td><td>C 添加 <code>is-out</code>，B 变成 <code>is-top</code></td></tr><tr><td>队列入队</td><td><code>queueLocal &gt;= 2/7/12/17</code></td><td>rear 指针向后移动</td></tr><tr><td>循环队列</td><td><code>circleLocal &gt;= 9</code></td><td>rear 从末尾回到 0 号位置</td></tr></tbody></table><p>技术上看，这套动画不是视频剪辑，而是一个由时间驱动的确定性 UI 状态机。</p><h2 id="5-视觉风格：geometric-bold">5. 视觉风格：Geometric Bold</h2><p>这套微课采用 Geometric Bold 风格：高饱和纯色、粗黑边框、大字号标题、强几何图形。</p><p>选择这个风格不是为了装饰，而是因为数据结构本身很适合被转译成几何对象：</p><table><thead><tr><th>数据结构对象</th><th>画面表达</th></tr></thead><tbody><tr><td>数组</td><td>等宽矩形格</td></tr><tr><td>链表节点</td><td>节点块 + 粗箭头</td></tr><tr><td>栈</td><td>竖向容器 + top 指针</td></tr><tr><td>队列</td><td>横向格子 + front/rear 指针</td></tr><tr><td>树</td><td>圆形节点 + 连接边</td></tr><tr><td>图</td><td>顶点网络 + 访问高亮</td></tr><tr><td>排序</td><td>柱状条 + 比较/交换颜色</td></tr></tbody></table><p>视觉规则保持克制：</p><ul><li>不使用渐变背景。</li><li>不使用模糊阴影。</li><li>主体元素使用纯色块和粗黑边。</li><li>代码只展示 2 到 4 行关键逻辑。</li><li>每一屏都必须有图形、流程图或结构图，避免变成文字卡片。</li></ul><p>例如讲顺序栈时，代码只保留最核心的两行：</p><figure class="highlight c"><table><tr><td class="code"><pre><span class="line">S.data[++S.top] = x;</span><br><span class="line">x = S.data[S.top--];</span><br></pre></td></tr></table></figure><p>画面同步展示 top 指针上移、元素入格、元素出格、top 回退。学生看到的不是孤立语法，而是“代码变量”和“图形状态”的一一映射。</p><h2 id="6-配音流程：分段生成-统一对齐">6. 配音流程：分段生成，统一对齐</h2><p>配音没有采用整篇一次性生成，而是按场景切成多个小段：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">assets/narration/</span><br><span class="line">  segments.csv</span><br><span class="line">  001.txt</span><br><span class="line">  002.txt</span><br><span class="line">  ...</span><br><span class="line">  audio-minimax/</span><br><span class="line">  aligned-minimax/</span><br><span class="line">  voice-03-stack-queue-minimax.wav</span><br></pre></td></tr></table></figure><p><code>segments.csv</code> 记录每段旁白的起止时间和文本文件。每个 <code>txt</code> 只对应一个明确的画面段落，例如“栈的概念”“push 动作”“pop 动作”“循环队列取模”。</p><p>这里的关键不是“把文本拆小”，而是让旁白也进入同一条时间轴。每一段旁白都有明确的开始秒数、结束秒数和对应文本：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">start,end,file</span><br><span class="line">78.90,101.76,004.txt</span><br><span class="line">102.26,127.86,005.txt</span><br><span class="line">128.36,153.06,006.txt</span><br></pre></td></tr></table></figure><p>这样第 004 段就只服务于入栈动画，第 005 段只服务于出栈动画，第 006 段只服务于栈代码解释。画面时间和音频时间不再靠人工感觉对齐，而是由同一份分段表约束。</p><p>分段的好处很明显：</p><ul><li>某一句念得不自然，只需要重生成这一段。</li><li>某个动画加长后，只需要调整对应段落。</li><li>音频可以用静音补齐或轻微变速对齐到目标时间。</li><li>最终再用 ffmpeg 将视频轨和旁白音轨合成。</li></ul><p>项目中使用 PowerShell 脚本封装 MiniMax TTS、ffprobe 时长检测、音频对齐和 ffmpeg 合成。大致流程是：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">读取 segments.csv</span><br><span class="line">  -&gt; 逐段读取 001.txt、002.txt ...</span><br><span class="line">  -&gt; 调用 TTS 生成原始语音</span><br><span class="line">  -&gt; 用 ffprobe 获取实际音频时长</span><br><span class="line">  -&gt; 对齐到目标 start/end 区间</span><br><span class="line">  -&gt; 拼接为整集旁白 wav</span><br><span class="line">  -&gt; 与无声 mp4 合成为带配音 mp4</span><br></pre></td></tr></table></figure><p>音频对齐时有两个常见情况：</p><table><thead><tr><th>情况</th><th>处理方式</th></tr></thead><tbody><tr><td>生成音频短于目标时长</td><td>在片段末尾补静音</td></tr><tr><td>生成音频略长于目标时长</td><td>轻微调整语速或回到文本压缩</td></tr></tbody></table><p>这一步的技术价值在于“可局部返工”。如果第 3 集最后一句公式讲得太快，只需要改 <code>011.txt</code> 并重生成最后一段，不需要重新处理整集旁白。最终输出也会保留无声视频和配音视频两个版本，例如：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">output/</span><br><span class="line">  episode-03-stack-queue.mp4</span><br><span class="line">  episode-03-stack-queue-minimax-voiceover.mp4</span><br></pre></td></tr></table></figure><p>保留无声版本可以让后续换声音、换语速、换平台字幕时更方便，避免每次都从浏览器重新渲染画面。</p><h2 id="7-质量检查：截图比肉眼拖进度条可靠">7. 质量检查：截图比肉眼拖进度条可靠</h2><p>数据结构微课的画面问题通常出现在关键帧：元素刚移动完、指针刚切换、代码刚高亮、字幕刚进入。单纯播放一遍很容易漏掉文字越界或状态错位。</p><p>因此项目保留了大量 <code>snapshots/</code> 截图，用于检查：</p><ul><li>画布是否完整填满 16:9。</li><li>中文是否正常显示。</li><li>标题、字幕、代码是否越界。</li><li>节点、箭头、数组格是否对齐。</li><li>当前讲解的变量是否和图形状态一致。</li><li><code>submit.html</code> 是否隐藏控制台和调试时间码。</li></ul><p>截图检查的具体做法是先列出每集的关键时刻，再用浏览器自动打开对应时间点：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">index.html?t=3</span><br><span class="line">index.html?t=78.9</span><br><span class="line">index.html?t=102.26</span><br><span class="line">index.html?t=234.26</span><br></pre></td></tr></table></figure><p>这些时间点不是随便选的，而是来自场景起止时间和动作变化时间。例如栈入栈要截 A 入栈、B 入栈、C 入栈三个状态；循环队列要截 rear 到 3、到 4、回绕到 0 的状态；图遍历要截 DFS 正在深入、BFS 队列扩展、访问完成这几个状态。</p><p>对数据结构课程来说，截图验收不只是看排版，还要看“教学状态是否正确”：</p><table><thead><tr><th>检查对象</th><th>技术检查</th><th>教学检查</th></tr></thead><tbody><tr><td>顺序栈</td><td><code>top</code> 指针位置是否和 CSS class 一致</td><td>是否体现后进先出</td></tr><tr><td>循环队列</td><td><code>front/rear</code> 是否正确回绕</td><td>是否解释清楚假溢出</td></tr><tr><td>二叉树遍历</td><td>节点高亮顺序是否正确</td><td>序列是否匹配先序/中序/后序定义</td></tr><tr><td>图遍历</td><td>顶点访问状态是否稳定</td><td>DFS 和 BFS 的差异是否可见</td></tr><tr><td>排序动画</td><td>比较、交换、已排序颜色是否区分</td><td>学生能否看出算法过程</td></tr></tbody></table><p>这种检查方式更接近前端 UI 自动化测试：不是“看起来差不多”，而是把每个关键状态固定下来，逐帧验收。尤其是 <code>submit.html</code>，必须单独检查，因为它是最终导出入口。开发入口没问题，不代表提交入口一定没问题；如果提交入口忘记隐藏控制台，最终视频就会带上时间码或滑块。</p><p>所以项目的验收标准可以写成一句话：<strong>同一秒钟，开发预览、截图结果、最终视频三者必须一致</strong>。</p><h2 id="8-技术取舍">8. 技术取舍</h2><p>这套方案的核心取舍是：用工程复杂度换取教学画面的可控性。</p><p>传统 PPT 更快，但状态变化不容易精确复现；专业动画软件表现力更强，但批量修改和版本管理成本高。HTML/CSS/JS 处在中间位置：开发成本可接受，又能把每个教学对象变成可维护的 DOM 状态。</p><p>更具体地说，项目做了几组取舍：</p><table><thead><tr><th>方案</th><th>优点</th><th>问题</th><th>本项目选择</th></tr></thead><tbody><tr><td>PPT 录屏</td><td>制作快、门槛低</td><td>精确动画和批量修改弱</td><td>不作为主方案</td></tr><tr><td>AE/PR 动画</td><td>视觉表现强</td><td>版本管理和程序化复用成本高</td><td>只适合后期包装</td></tr><tr><td>Canvas</td><td>绘制能力强</td><td>文本排版和 DOM 调试不如 HTML 直观</td><td>局部可用，不作为主结构</td></tr><tr><td>HTML/CSS/JS</td><td>可维护、可截图、可复现</td><td>初期工程搭建更复杂</td><td>作为主方案</td></tr></tbody></table><p>另一个取舍是“CSS class 驱动”而不是“直接改 style”。例如元素进入、指针移动、代码高亮都尽量通过添加 <code>is-in</code>、<code>is-top</code>、<code>is-lit</code> 等类名完成。这样 JS 负责状态，CSS 负责表现，两者边界比较清楚：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">JS：现在 C 应该是栈顶</span><br><span class="line">CSS：栈顶应该用什么颜色、边框、位置、过渡效果</span><br></pre></td></tr></table></figure><p>这会让调试更直观。打开浏览器开发者工具，看一个节点有没有 <code>is-top</code>，就能判断是逻辑没算对，还是样式没写对。</p><p>当前方案适合以下场景：</p><ul><li>需要大量结构化图解。</li><li>需要反复修改局部动画。</li><li>需要批量生产同一视觉系统下的视频。</li><li>需要把知识点、代码、旁白、截图、成片统一纳入版本管理。</li></ul><p>不适合的场景也很明确：</p><ul><li>只做口播课，不需要复杂动画。</li><li>追求影视级特效。</li><li>内容变化极少，不需要工程化复用。</li></ul><h2 id="9-后续自动化方向">9. 后续自动化方向</h2><p>项目已经形成了清晰流水线，后续可以继续自动化：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">输入主题和知识点</span><br><span class="line">  -&gt; AI 生成脚本</span><br><span class="line">  -&gt; AI 生成 HTML/CSS/JS</span><br><span class="line">  -&gt; 浏览器自动截图检查</span><br><span class="line">  -&gt; 渲染无声 MP4</span><br><span class="line">  -&gt; 生成分段旁白</span><br><span class="line">  -&gt; TTS 配音</span><br><span class="line">  -&gt; 音视频合成</span><br><span class="line">  -&gt; 前端面板展示进度和产物</span><br></pre></td></tr></table></figure><p>这里最值得继续投入的是“自动检查”。因为 AI 可以生成脚本和代码，但最终教学质量仍然取决于画面是否清楚、节奏是否合理、代码是否真的对应动画。自动截图、关键帧验收、样式规则检查，比单纯追求一键生成更重要。</p><p>后续可以把自动化拆成三个层次：</p><p>第一层是文件级检查。脚本可以检查每集是否都有 <code>index.html</code>、<code>submit.html</code>、<code>style.css</code>、<code>script.js</code>、<code>segments.csv</code> 和 <code>output/</code>，以及根节点是否声明 <code>data-composition-id</code>、<code>data-width</code>、<code>data-height</code>、<code>data-duration</code>。</p><p>第二层是画面级检查。用 Playwright 打开每个关键帧，自动截图并保存到 <code>snapshots/qa-current/</code>。如果画布不是 16:9、出现横向滚动条、标题越界、字幕为空、调试控件出现在提交入口，就直接报错。</p><p>第三层是教学一致性检查。每个 episode 可以维护一份关键帧清单：</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">  <span class="punctuation">&#123;</span> <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span> <span class="number">78.9</span><span class="punctuation">,</span> <span class="attr">&quot;expect&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;scene-stack-push&quot;</span><span class="punctuation">,</span> <span class="string">&quot;item-a&quot;</span><span class="punctuation">]</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span> <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span> <span class="number">102.26</span><span class="punctuation">,</span> <span class="attr">&quot;expect&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;scene-stack-pop&quot;</span><span class="punctuation">,</span> <span class="string">&quot;pop-c&quot;</span><span class="punctuation">]</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span> <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span> <span class="number">260.46</span><span class="punctuation">,</span> <span class="attr">&quot;expect&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;scene-formulas&quot;</span><span class="punctuation">,</span> <span class="string">&quot;f-empty&quot;</span><span class="punctuation">]</span> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><p>自动化脚本根据清单检查 DOM class 是否符合预期。这样不仅能发现“页面有没有渲染”，还能发现“该亮的元素有没有亮”。对于数据结构微课，这比单纯截图更重要，因为教学错误往往不是页面空白，而是某个指针、某个访问顺序、某个公式和旁白不一致。</p><p>如果继续扩展，还可以把 AI 生成内容纳入这个流程：AI 先生成脚本和场景代码，再由自动检查给出失败点，例如“第 145 秒 DFS 高亮节点和旁白不一致”“第 210 秒公式卡片超出舞台”。这样 AI 不只是生成代码，还能进入一个可验证、可迭代的制作闭环。</p><h2 id="10-总结">10. 总结</h2><p>这套数据结构微课的技术路线可以概括为一句话：</p><blockquote><p>用前端工程的方法，把抽象的数据结构状态变化变成可定位、可复现、可检查、可合成的视频动画。</p></blockquote><p>它不是把网页录成视频这么简单，而是把视频当成一条可编程时间轴：每个知识点对应一个场景，每个场景对应一组几何对象，每个对象的状态都能被脚本精确控制。对数据结构这种强调“过程理解”的课程来说，这种方式能把抽象概念转成学生真正看得见的变化。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;用-web-技术做一套数据结构微课：从知识点到可发布视频&quot;&gt;用 Web 技术做一套数据结构微课：从知识点到可发布视频&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文记录《数据结构微课》项目的技术设计与制作流程。项目成片已发布到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;B</summary>
        
      
    
    
    
    <category term="教育技术" scheme="https://college-github-io.pages.dev/categories/%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF/"/>
    
    <category term="微课制作" scheme="https://college-github-io.pages.dev/categories/%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF/%E5%BE%AE%E8%AF%BE%E5%88%B6%E4%BD%9C/"/>
    
    
    <category term="数据结构" scheme="https://college-github-io.pages.dev/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    <category term="微课设计" scheme="https://college-github-io.pages.dev/tags/%E5%BE%AE%E8%AF%BE%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="Web动画" scheme="https://college-github-io.pages.dev/tags/Web%E5%8A%A8%E7%94%BB/"/>
    
    <category term="前端工程" scheme="https://college-github-io.pages.dev/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
    <category term="AI配音" scheme="https://college-github-io.pages.dev/tags/AI%E9%85%8D%E9%9F%B3/"/>
    
  </entry>
  
  <entry>
    <title>私密文章</title>
    <link href="https://college-github-io.pages.dev/posts/a5e1c7d3/"/>
    <id>https://college-github-io.pages.dev/posts/a5e1c7d3/</id>
    <published>2026-04-27T06:40:00.000Z</published>
    <updated>2026-07-23T02:52:16.721Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，这个密码看着不太对，请再试试。" data-whm="抱歉，这个文章不能被纠正，不过您还是能看看解密后的内容">  <script id="hbeData" type="hbeData" data-hmacdigest="4626db39af4bc231d1d5ee785bcbb67ba9f9196409030e7cd55b74abd1513a21">14aa4db32d53826897370f02a563f756924face24f018f19690c80616fd18eec72408ec6d3325d67cf81961d437192c334845335d2b36201b1c1c7595f287048f8831e8acbcdc6ea6776ea1979798588dc0e18a56b9b35f98e7f5b93436941db62049db235d80f7cf62ff24547889ee5bd56d60c676225ca3543235ddc697dc399b838adce6cd53c2fdbbdc8429c4ad42374598b74e19424dd4572b66f87d932ac898ed4964f7d13d0e0fafa4b8cd661317bf648e0d3a8e494758297052592b191735a6123c017f684f5b5c6a20eef0642347f386456fce8bc47fc636dc585c7234127ea14e73a950ded0cf0dcac284c88fe6fc3b85aa380f26e0a8e94fb5ebadd0f1c88039a93cf79cbf9a7af0773b29852fa1cccb161ea45dad29873a60e49ce0fd1da47300a7786611e0a263d059738da0409e62963db7eda5c33e1f2d33426532981c83ee8976442e69faa63c685d20a3b1d2d9db04978444609a4a83f17d642ae5a6c0db80841c7c54fba0d22f2ce5059d1a9032b1990a3dfeb41583a64ed72831293fa2bc78e1fdf9fdd412ba18fd9388f38cb48b8f833fc0e3035517cedc6183f0c7d3e7cc7326b5fd57da3efb386ad2dc839e51dcb3da8c036f4bb492188720e94f544d8b595489c0d7e79a4e9893fb12f8a4ad8a7c3da57fca81077d26fb428b19b68671e3547a7f75a306cf583c46c155dec0ba5213caff84aa9c77165915895ffb1ebee3764accaef56d14080bded2f76d1ac537b68f4f0387f493258ff74b20b926600e55e75e2059631630865b129dd4a94beaa0e90891d13870a133d5bc3a7c96fbb53e420cdc0f30d012202e4d76930c92a0aa841023f53a529ea15f197ec55fe9831b53d5e5d8c5b8e8ffdb22f0f00e563eeb3dea7c6ad35c3d415b542c12366e3a9e75bfac993b65176833cb505c0d17f082d84f2020d4ef393edb67a3ae3b76adbe19d9bc95b23c59dbdb46ab8fb194f925b2532759e5ce2d7a300612663626a6a6b3e7fec96f701b4f44e2ffe5b48be377a95eeb2a9f478c85e6d42ae515028f1e6071a3c976e787be114125899ae0107c728ca1d9fac3584bd8e60af44a315999bc4000954a000ecdf996d26cd1fbc7f46968cd6e7b0d2e4a5a5d2531d7b93a5f47ef69c489e4de3bf7c3aa85ca2ff111a3e9243ae4960f20cf8564d908501ddea9523b64f5a3993fbd94196a1581f507a6a40be5ccd18a3761aa1ac23625fed65d402cb559f14324c66f59f3001f18470b6a8a05ef54d60538f3a9f924e9c13cae0fd10a503edafff7becaf7f641f34f39cab1a6062cf17491925615db07e7ee01d76b316fb8da665f1b513d4121f0c58a58af6f9366b5e85be4db75af5d8fb0d1c927deb80a72a42731be40e5440bc513176275e65dce4481b09e251e3293a56bfa90d6ac3e17e2746133b0400107173486806812a513c0ffe0e3802cb1a076a5544d6e8840ae910cc7f3a0aecb12b98515526a65165ba228bcfe34b773a61d9acd134aa4f2cb0997a16456a08e0d037792e976c0ba2a970f6601e52c537be58b12bd817a2c58ec4333dc4d29fade69ebc4d23526517d537d6860cfd90a95339437829662b5c28be13ef8a034a23faceced88b749be42bac4adf70a35d9d37510cfee5b55c12a762351c944099b3584e584617dc99615a56946c106bc382a5a39e160106be1cb2dabf9eaf2cbb97d33355fc30ee670dd52f253e22ce9efe0e71f5df2700d200d52d5165de5438b4afa69ce0fa625c1b6634141ac86f105e1d23237f25a8af24ff5b4d5a97b39a3923b0de10d58be06952fefe1bcb37d571abee02a3fe41c8831aca696e83969d59eeef3c41d5222ad99bef367eb402e40509f520652de82f5a015ee0ad90b89a268f04935b305b934f1967b2a51fadc5353d41baee2880048fd387847a67b643019c728f8248378b50a1afb190ce7abc87d9fc95453f3887182fefd8f270a8518d5b118b80dc1a814c4d01e8bf1e86329f7f60e18796f68af2a461c839f0c107069076dbb589293ffe50928b6e6aaf0bdb9c6184c68a39e4b41fb9273226f7cc7ba240e77a31e7410a7ee95e3773152f3854c78574f93d7b45af9ddf0c50e23779b533343c5faccca391838abdd88c316aa118241dafbb0c8a41bad1abe7b7419947a4107e9df09c3b53baf8a7e2390192bec70bc3161a5f2c656765762c39a4671cf377a1648f63a53ae347e87362d483d91593f792a48835b5e4c6da4f0439004568ee3319465656e785fe3f03ad43e6916a537ec184c99514043d4a2694490746fc85cf8e7c06023cb0cf5fe48e87ac3972a3a65eeef10d0c9e0464d17f79d6fa9f8630a22b93b328a77d2398315c84f19093eb133a99eeb3b2b14da14ad52860092a9ef9f1a08513884e0016b3c25b30f23d33a1d574211811f6ea3fe477a94af7933f97cb31858d3ffc0ae48ddb313ef4a8fc54d24519d5647bef096eb7bc5c9cf444a6510d27f093500a266531766f126a4301f596e766d0caf62c5028e5ac7e0c12c0d9ad62861f9a4f311ae7725c3b6f249281006d9c68664c93704ab4d436357d4e1170fa45aa6b445a056d4b0058df1fca6ae6a0f89db84ff89dbd53285b763f253d31d4e556670ca9cea0ed4c9af4334f89dd</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好，这里需要密码。</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">这里有东西被加密了，需要输入密码查看哦。</summary>
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="单词记忆" scheme="https://college-github-io.pages.dev/tags/%E5%8D%95%E8%AF%8D%E8%AE%B0%E5%BF%86/"/>
    
    <category term="SM-2算法" scheme="https://college-github-io.pages.dev/tags/SM-2%E7%AE%97%E6%B3%95/"/>
    
    <category term="番茄钟" scheme="https://college-github-io.pages.dev/tags/%E7%95%AA%E8%8C%84%E9%92%9F/"/>
    
    <category term="英语学习" scheme="https://college-github-io.pages.dev/tags/%E8%8B%B1%E8%AF%AD%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Vue3" scheme="https://college-github-io.pages.dev/tags/Vue3/"/>
    
    <category term="FastAPI" scheme="https://college-github-io.pages.dev/tags/FastAPI/"/>
    
  </entry>
  
  <entry>
    <title>我做了一个仓库到Agent上下文的编译器 repo2skill</title>
    <link href="https://college-github-io.pages.dev/posts/f4d0b6c2/"/>
    <id>https://college-github-io.pages.dev/posts/f4d0b6c2/</id>
    <published>2026-04-27T06:30:00.000Z</published>
    <updated>2026-04-27T06:57:52.656Z</updated>
    
    <content type="html"><![CDATA[<h1 id="我做了一个仓库到agent上下文的编译器-repo2skill">我做了一个仓库到Agent上下文的编译器 repo2skill</h1><p>最近发布了一个自己长期打磨的项目，<strong>repo2skill</strong>。</p><p>解决的问题很具体：你拿到一个陌生 GitHub 仓库，Coding Agent 不知道从哪看起、该跑什么命令、哪些测试可信、哪些目录不能乱改。repo2skill 做的事就是把陌生仓库编译成 Agent 可以直接消费的 onboarding 上下文。</p><p>一条命令：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npx repo2skill https://github.com/owner/repo</span><br></pre></td></tr></table></figure><p>输出六份产物：<code>repo2skill.json</code>、<code>project-map.md</code>、<code>AGENTS.md</code>、<code>SKILL.md</code>、<code>quickstart.windows.md / macos.md / linux.md</code>，外加一份可视化 HTML 报告。</p><p>核心设计原则：</p><ul><li><strong>证据优先</strong> — 包管理器、scripts、入口点、环境变量全部从配置文件提取，不靠 LLM 脑补</li><li><strong>置信度分级</strong> — 每一条结论绑定来源文件和置信度（高/中/低），低置信度默认隐藏</li><li><strong>同源输出</strong> — 所有文件从同一个 <code>repo2skill.json</code> 导出，不会各说各话</li><li><strong>四层架构</strong> — 采集层 → 静态分析层 → 推断压缩层 → 模板导出层</li></ul><p>第一版聚焦 Node.js / TypeScript 公开仓库。已经是可用的 npm 包，支持 OpenAI / DeepSeek 等兼容 API。</p><p>仓库地址：<a href="https://github.com/haodehaode378/repo2skill">https://github.com/haodehaode378/repo2skill</a></p><hr><p>如果你的 Agent 经常在陌生仓库里迷路，试试丢给它一份 repo2skill 生成的上下文。欢迎拿你的仓库来压测。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;我做了一个仓库到agent上下文的编译器-repo2skill&quot;&gt;我做了一个仓库到Agent上下文的编译器</summary>
        
      
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="开发者工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="Agent" scheme="https://college-github-io.pages.dev/tags/Agent/"/>
    
    <category term="Codex" scheme="https://college-github-io.pages.dev/tags/Codex/"/>
    
    <category term="CLI" scheme="https://college-github-io.pages.dev/tags/CLI/"/>
    
    <category term="开发者效率" scheme="https://college-github-io.pages.dev/tags/%E5%BC%80%E5%8F%91%E8%80%85%E6%95%88%E7%8E%87/"/>
    
    <category term="开源工具" scheme="https://college-github-io.pages.dev/tags/%E5%BC%80%E6%BA%90%E5%B7%A5%E5%85%B7/"/>
    
    <category term="TypeScript" scheme="https://college-github-io.pages.dev/tags/TypeScript/"/>
    
  </entry>
  
  <entry>
    <title>私密文章</title>
    <link href="https://college-github-io.pages.dev/posts/e3c9a5b1/"/>
    <id>https://college-github-io.pages.dev/posts/e3c9a5b1/</id>
    <published>2026-04-27T06:20:00.000Z</published>
    <updated>2026-07-23T02:30:30.350Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，这个密码看着不太对，请再试试。" data-whm="抱歉，这个文章不能被纠正，不过您还是能看看解密后的内容">  <script id="hbeData" type="hbeData" data-hmacdigest="09d9beda3bcb39695a971987dda7ee0e862158adcd57deec20c04a93d95c03e6">14aa4db32d53826897370f02a563f756924face24f018f19690c80616fd18eec72408ec6d3325d67cf81961d437192c3a14ffb007cc91b0eb422845763eb1034b86650dd4bf619a1f987342fc1fca327fb6eafad3743e32cdf80838833e621914e21b0234c363022f3b4688ede450c6b7fca94b2a6a6aceaa820c1b125256c465a95b0437ae414242e579bc483f1606ec195393e60d45158b5c237fbbfe3cc6c562caf7494a78569570b27f9809d1667120e185a2f10dbaf23d7f91486fe9c1b49ff30d360adfcf482552e68b1db06b951e19c1b7bc49e216b5cef4412ca6459e474966e4e07f6a62d7a7004e728639ece84412c3a8934878afc2b7d82e99906e8cf694070f51e499132c30bf9fdeee7b6e30fe8bced1170ecff739dd0726472be463226138fbe38dc5c10b1ed500141abf5daaf83efa344d1d3019b42bb4dc59edfc35c48e61810ef5418a7138e8d2b289b8d6b698846a1224226e17bd2a73207b990f71ebc64a0d238d138bf1a7407ee8b02d83bbec1b2fb214df88ad841c0e43bd85449654ff37d3c8d8da0ab720453dd4d1166f86d07d56f13d8b48fbd8bfed365086abd846fc407ba3fe586db77fc9ee6a23e13a22a75a42bb588ce67ebbc208c1f84327219f2e1eec5e5eb7c6349ec6676a3e2aa7d660d8e48d35140d4625e9522abb2ed0e475641c8d02941deba9b6446311379ad91f698e4f0792c4ec76f95dfc47fd220fa6cef068d5b54dcd0ac57d709865b5df7a5f8c49d8e2ad29470b27e07dd94b8f676d6d2c74065e1e941766ee203f0b8129f2fe5a8e33559d12bc0aaec44f8a6086e35570cd8e9357a83ce5616cbcd2dbd40c880721dbe711415a1af70606fe5e5f3283dd844ed80e8a2fd02c7ab6513866acb3908e13532e2aa50320f5f7b85a202ecd3f8e7523ec9c640d85cf930b906371fdecbe652e652d836eaca14081df77359c58c3d8a9b9a26d8f7c2e2f64299991326f518b428cc73bafde81626fd0a1ff9e423de79bc2370ada0fc740c2ab6ff2df2c8ac064906143b80536c186ee196a1f0df56c83ee8a8ebbcb121f3c3bb16de3f8f887087b02b6e45abf78b4fd7a8e776f369dffa510e61954d628a8ef8df17fbfb75c1f3913605b8c952f1c25779b13087929d0d98084056b337f51fe181e423b3afde53245f9f201da99e0c854db60671726dad74e4a04cda74fb883f6cb37591d941fc44c3a9d454baf5eb12bd504f1fd6100eaaaafe9a82928548e8b6c6644e3619c898440dbea0557c50c3b1fd2de209b9aa7df08fd66f87195cafdfb6e593ce26c31c012551ad2c5a318f7a3ef77b51920f633c7d2f1365fe23d01ab9e47f9d947a4b51b34b9ab5e8a9ee0ba743981d081926a0522040772426f2573af49d711bf7946563a6cb1e6aa45398a2a058099935aaced09ce74bdec1ca6c7d12ed7233c0fccbc2b4a7f874ed9f635603e6164a45374dfb02f607579626435f1df75e8e9399242db35402ef68efe5b199e1bdf48c8e9a770804199addf3363c56d9c097aa3d1982485a89e13f292fd7165ca8acc71a31aaa10f53cde925130ab4eea6740c53699bfa3ab9c815f04dceb3c24d5b088204f18a2cb7e7c93f0b90ba12fba0ff8c4f32011be09b2cf6592884ef92404d44efb8ed1dbc7ddbaa7638c855961868cfdd3fca5a04eeccff355dc11b72bd3aecce4329a0355343cbdd000d95dbd7e1c15387d61166c86875a1f63dce9e18f848196bdfa7fbaa89dc253bcaf63e0850139ad5e985fdfedf6d26f807dd65be9a78fcf970641d6428124b0830b95ee04fffd18d17e42ae04813d75c824676fc8ab76d7028b685aa20b886dae2f643f223c67980909dac61f634d2c6cf772545bf6f310485dcc60d8dd4e9ab621bc3164209192f3905606b6c27196ff156be47543d629cec666bbd505ce55cd33bce616f69331d14513077bc08b99348a235735f6d13e1e09142a0ab132482a9871fb10066ef98af54e2f064ae2b669beb6c4b8b574029602c51bfa412af7c187f3ffaed19faab29b7c7972ba1f429c379d6c830964519edc18ed40cef8cda6f9cb9f857ea2952e827311eaeab2ca33cccd53d9bd17b4f8617c3b11c54eb34114afd48e912cf9f035d26cab9a2f174e528dd1b5df779fbe2d9a95f1dfa5a5b816739b1fc191ac0f4a64b417940c226f19120b32799bde6f161d7a0d4951ef60a0b082a9f968ca6d479dcda241d5cf098c5f4083a206e486b375e942fb4fbf6d081f2df5ee392ecf19199a343e3559cbf2a58bee8bfcb7581d56bed8e946b7973c7a7ffc711503c01e3b3957b64ffdceb0b3773ab67e5cc18b5b1d62a6037cb65bb15ab7c913748a9ca599c4ed6c02cfa4c96bac8</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好，这里需要密码。</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">这里有东西被加密了，需要输入密码查看哦。</summary>
    
    
    
    <category term="AI工具" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="面试系统" scheme="https://college-github-io.pages.dev/categories/AI%E5%B7%A5%E5%85%B7/%E9%9D%A2%E8%AF%95%E7%B3%BB%E7%BB%9F/"/>
    
    
    <category term="AI面试" scheme="https://college-github-io.pages.dev/tags/AI%E9%9D%A2%E8%AF%95/"/>
    
    <category term="多Agent协作" scheme="https://college-github-io.pages.dev/tags/%E5%A4%9AAgent%E5%8D%8F%E4%BD%9C/"/>
    
    <category term="简历解析" scheme="https://college-github-io.pages.dev/tags/%E7%AE%80%E5%8E%86%E8%A7%A3%E6%9E%90/"/>
    
    <category term="HR工具" scheme="https://college-github-io.pages.dev/tags/HR%E5%B7%A5%E5%85%B7/"/>
    
    <category term="流式对话" scheme="https://college-github-io.pages.dev/tags/%E6%B5%81%E5%BC%8F%E5%AF%B9%E8%AF%9D/"/>
    
  </entry>
  
</feed>
