![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
读书笔记
文章平均质量分 92
读书笔记
coding-hwz
生前何必久睡
展开
-
[第四章] 深入理解计算机系统第三版 家庭作业参考答案
[第四章] 深入理解计算机系统第三版 家庭作业参考答案转载https://blog.csdn.net/one_of_a_kind/article/details/81836111转载 2021-11-20 11:44:15 · 301 阅读 · 0 评论 -
《深入理解计算机系统第三版》— 第六章 — cache lab
《深入理解计算机系统第三版》— 第六章 — cache lab一、partA二、partB 32*32三、partB 64*64这章的实验还挺有意思,简单记录下做法。一、partApartA 相对来说比较简单,需要注意的就是 LRU 的使用,以及对于同一个 set 中的不同行,它们并不是存放连续的地址。以 s = 1,E = 2,b = 1 为例:第一个 set 的第一行存放的是 0x2 0xa ···,二第二行存放的是 0x6 0xd ···。二、partB 32*32像手册中提到的,这里的关键原创 2021-11-30 12:05:22 · 574 阅读 · 0 评论 -
《深入理解计算机系统》—— 存储器、链接和内存管理
@Toc一、存储器层次结构1、存储器层次结构中的缓存(1)缓存不命中(2)缓存不命中的种类2、高速缓存存储器(1)通用的高速缓存存储器组织结构(2)直接映射高速缓存a. 组选择b. 行匹配c. 字选择d. 不命中时的行替换e. 冲突不命中(3)组相连高速缓存a. 组选择同直接相连高速缓存b. 行匹配和字选择c. 不命中时的行替换(4)全相连告诉缓存a. 组选择b. 行匹配和字选择(5)有关写的问题二、链接1、静态链接2、目原创 2022-05-17 09:18:12 · 303 阅读 · 0 评论 -
《操作系统概念》—— 内存管理
《操作系统概念》—— 内存管理一、内存管理策略1、基本硬件2、地址绑定3、逻辑地址空间与物理地址空间4、动态加载5、动态链接与共享库6、交换7、连续内存分配(1)内存分配(2)碎片8、分段(1)基本方法(2)分段硬件9、分页(1)基本方法(2)硬件支持(3)保护(4)共享页10、页表结构(1)分层分页(2)哈希页表(3)倒置页表二、虚拟内存管理1、背景2、请求调页3、写时复制4、页面置换(1)基本页面置换(2)FIFO页面置换(3)最优页面置换(4)LRU页面置换(5)近似LRU页面置换a. 额外引用位算法原创 2022-05-15 22:48:26 · 286 阅读 · 0 评论 -
《操作系统概念》—— 同步与死锁
《操作系统概念》—— 同步与死锁一、同步1、竞争条件2、临界区问题(1)定义和解决条件(2)内核竞争3、Peterson解决方案4、硬件同步5、互斥锁6、信号量(1)定义(2)使用(3)实现(4)死锁与饥饿(5)优先级的反转7、经典同步问题(1)有界缓冲问题(2)读者-作者问题(3)哲学家就餐问题8、管程(1)出现原因(2)使用方法(3)哲学家就餐问题的管程解决方案(4)采用信号量的管程实现(5)管程内的进程重启二、死锁1、必要条件2、资源分配图3、死锁处理方法4、死锁预防(1)互斥(2)持有且等待(3)无原创 2022-05-15 22:46:52 · 238 阅读 · 0 评论 -
《操作系统概念》—— 进程与线程
@Toc一、进程1、进程状态2、进程控制块(PCB)3、进程调度等待运行的进程保存在就绪队列上;等待特定I/O设备的进程列表,称为设备队列。对于批处理系统,提交的进程多于可以立即执行的。这些进程会被保存到大容量存储设备的缓冲池,以便以后执行。长期调度程序从该池中选择进城。短期调度程序从准备执行的进程中选择进程。I/O密集型进程,执行I/O比执行计算需要花费更多时间。相反,CPU密集型进程很少产生I/O请求,而是将更多时间用于执行计算。4、进程间通信(1)共享内存系统(2)消息传原创 2022-05-15 22:42:46 · 383 阅读 · 0 评论 -
《敏捷软件开发》— 设计模式(一)
《敏捷软件开发》— 设计模式(一)一、Command 模式和 Active Object 模式1、Command 模式2、Active Object 模式一、Command 模式和 Active Object 模式1、Command 模式我们在 《设计模式》— 行为型模式 — 命令模式中学习过命令模式。该模式可以将负责实现业务逻辑的模块与上层模块分离。2、Active Object 模式Active Object 模式是命令模式在多线程控制的具体应用。...原创 2022-02-27 22:17:57 · 383 阅读 · 0 评论 -
《敏捷软件开发》— 设计原则(三)
《敏捷软件开发》— 设计原则(二)一、依赖倒置原则1、层次化(1)接口所有权的倒置(2)依赖于抽象二、接口隔离原则(ISP)1、接口污染2、分离客户与分离接口3、满足 ISP一、依赖倒置原则高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。这里有个很有趣的问题:为什么是倒置呢?在经典的层次结构中,我们会把系统设置为三层模式:表示层,服务层,持久化层。其中,表示层依赖于服务层,服务层依赖于持久化层。一个设计良好的面向对象程序,其依赖程序结构相对于传统的过原创 2022-02-24 22:02:37 · 392 阅读 · 0 评论 -
《敏捷软件开发》— 设计原则(二)
《敏捷软件开发》— 设计原则(二)一、Liskov 替换原则(LSP)1、关键仍是抽象2、几维鸟(1)几维鸟是一种鸟(2)几维鸟不是鸟3、正方形和矩形一、Liskov 替换原则(LSP)子类型必须能够替换掉它们的基类型。如果我们不遵守这项原则,则导致在使用派生类对象作为参数调用以基类对象为参数的方法时,程序的运行错误行为。这种错误有可能是抛出了异常,也有可能是错误的运行状态。1、关键仍是抽象想要满足里氏替换原则,关键仍在抽象上。在某个程序或者某个领域中满足此原则的设计,在经过迁移后可能会变得不原创 2022-02-23 21:37:38 · 277 阅读 · 0 评论 -
《敏捷软件开发》— 设计原则(一)
《敏捷软件开发》— 设计原则一、单一职责原则(SRP)1、职责2、分离耦合的职责二、开放-封闭原则(OCP)1、抽象2、Shape 程序一、单一职责原则(SRP)就一个类而言,应该仅有一个引起它变化的原因。这项设计原则体现了模块的内聚性要求。当需求变化时,该变化会反映为类的功能的变化。如果一个类承担了多于一个的职责,那么就可能有多个原因导致其发生变化。一个职责的变化可能会抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,无法很好的响应变化。1、职责在 SRP 中,我们把职责定义为变化的原原创 2022-02-10 21:46:34 · 614 阅读 · 0 评论 -
《敏捷软件开发》— 敏捷设计
《敏捷软件开发》— 敏捷设计一、设计的臭味1、僵化性2、脆弱性3、牢固性4、粘滞性5、不必要的复杂性6、不必要的重复7、晦涩性二、copy 程序1、初始需求2、增加输入设备类型3、增加输出设备类型4、copy程序的敏捷设计一、设计的臭味1、僵化性僵化性是指难以对软件进行改动,即使是简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。很多开发人员在工作中都遇到过这样的情况。看着很简单的一个问题,只改了一行代码,却影响了整个程序。这就是所原创 2022-02-08 20:01:37 · 612 阅读 · 0 评论 -
《敏捷软件开发》— 敏捷开发 — 极限编程概述
《敏捷软件开发》— 敏捷开发 — 极限编程概述一、极限编程是敏捷方法中最著名的一个。它由一系列简单却相互依赖的时间组成。一、原创 2022-01-28 19:45:24 · 679 阅读 · 0 评论 -
《敏捷软件开发》— 敏捷开发 — 敏捷实践
《敏捷软件开发》— 敏捷开发一、敏捷实践1、敏捷联盟(1)个体和交互胜过过程和工具(2)可以工作的软件胜过面面俱到的文档一、敏捷实践在敏捷开发之前,我们常用的开发模式是瀑布模式。然而,这种模式有很多问题,包括不能很好的响应变化,容易开发出庞杂而难以理解的系统,导致维护和二次开发变得很困难等。此外,这种模式还会降低团队的开发效率,使得团队经常创建错误的产品。其原因在于这样的过程缺乏实践指导和外部过程管控。即使在现在,国内还有很多公司采取的是瀑布式开发模式。1、敏捷联盟01年初,由于看到许多公司的软件团原创 2022-01-24 09:39:55 · 1733 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 解释器模式
《设计模式》— 行为型模式 — 解释器模式一、动机二、适用性三、结构四、参与者1、AbstractExpression2、TerminalExpression(终结符表达式)3、NonterminalExpression(非终结符表达式)4、Context5、Client五、效果1、易于改变和扩展问法2、易于实现文法3、负责的文法难以维护4、增加了新的解释表达式的方式六、实现1、创建抽象语法树2、定义解释操作3、与 Flyweight 模式共享终结符一、动机如果一种特定类型的问题发生的频率足够高,那么可原创 2022-01-21 21:15:11 · 509 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 备忘录模式
《设计模式》— 行为型模式 — 备忘录模式一、动机二、适用性三、结构四、效果1、保持封装边界2、简化了原发器3、使用备忘录可能代价很高4、定义窄接口和宽接口5、维护备忘录的签字按代价五、实现1、语言支持2、存储增量式改变一、动机有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制。而要实现这些机制,你必须实现将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其部分或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该原创 2022-01-20 19:57:55 · 285 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 访问者模式
《设计模式》— 行为型模式 — 访问者模式一、动机二、适用性三、结构四、参与者1、Visitor2、ConcreteVisitor3、Element4、ConcreteElement5、ObjectStructure五、协作六、效果一、动机考虑一个编译器,它将源程序表示为一个抽象语法树。该编译器需要在抽象语法书上实施某些操作以进行”静态语义“分析,例如检查所有的变量是否都已经被定义了。它也需要生成代码。因此它可能要定义许多操作以进行类型检查、代码优化、流程分析,检查变量是否在使用前被赋值等。此外,还可以原创 2022-01-18 20:16:13 · 124 阅读 · 0 评论 -
《设计模式》— 结构型模式 — 享元模式
《设计模式》— 结构型模式 — 享元模式一、意图一、意图有些应用程序得益于在其整个设计过程中采用对象技术,但简单化的实现代价极大。例如,大多数文档编辑器的实现都有文本格式化和编辑功能,这些功能在一定程度上是模块化的。面向对象的文档编辑器通常使用对象来表示嵌入的成分,例如表格和图形。尽管用对象来表示文档中的每个字符会极大地提高应用程序的灵活性,但是这些编辑器通常并不这样做。字符和嵌入成分可以在绘制和格式化时统一处理,从而在不影响其他功能的情况下对应用程序进行扩展,支持新的字符集。应用程序的对象结构可以模原创 2022-01-16 21:14:24 · 137 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 中介者模式
《设计模式》— 行为型模式 — 中介者模式一、动机一、动机面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作——系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为分布在许多对象中。这造成我们不得不定义很多子类以定制系统的行为。...原创 2022-01-14 22:06:44 · 68 阅读 · 0 评论 -
《设计模式》— 结构型模式 — 外观模式
《设计模式》— 结构型模式 — 外观模式一、动机二、适用性三、结构一、动机将一个系统划分成若干个子系统有利于降低系统地复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一就是引入一个外观对象,它为子系统中较为一般的设施提供了一个单一而简单的界面。这个模式在如 Windows 操作系统中应用的十分广泛。在使用命令行作为交互工具的操作系统中,其提供的各项功能固然强大,但是这种交互方式却不适合普通用户使用。在 Windows 操作系统中,提供了一个用户界面并且对用户屏蔽了原创 2022-01-12 20:54:02 · 136 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 策略模式
《设计模式》— 行为型模式 — 策略模式一、动机二、适用性三、结构四、参与者1、Strategy2、ConcreteStrategy3、Context五、协作六、效果1、一个替代继承的方法2、客户必须了解不同的策略3、增加了对象的数目七、实现1、定义 Strategy 和 Context 接口2、将 Strategy 作为模板参数八、应用一、动机有许多算法可以对一个文本流进行分行。将这些算法硬编进使用它们的类中是不可取的。其原因如下:需要换行功能的客户程序如果直接包含换行算法代码的话将会变得复杂,这原创 2021-12-22 21:52:33 · 88 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 迭代器模式
《设计模式》— 行为型模式 — 迭代器模式一、动机二、适用性三、结构四、效果1、支持以不同的方式遍历一个聚合2、简化了聚合的接口3、在同一个聚合上可以有多个遍历五、实现1、谁该控制迭代2、谁定义遍历算法3、迭代器健壮性如何4、用于组合对象的迭代器六、应用一、动机一个聚合对象,如列表(list),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。此外,针对不同的需求,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些便利操作,你也可能不希望列表的接口中充斥着各种不同遍历的操作原创 2021-12-21 21:36:42 · 356 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 观察者模式
《设计模式》— 行为型模式 — 观察者模式一、动机二、适用性三、结构四、参与者1、Subject2、Observer3、ConcreteSubject4、ConcreteObserver五、协作六、效果1、目标和观察者间的抽象耦合2、支持广播通信3、意外的更新七、实现1、创建目标到其观察者之间的映射2、观察多个目标3、谁触发更新4、在发出通知前确保目标的状态自身是一致的5、避免特定于观察者的更新协议 —— 推/拉模型6、显式地指定感兴趣的改变7、封装复杂的更新语义八、应用一、动机将一个系统分割成一系列相原创 2021-12-20 21:51:01 · 324 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 命令模式
《设计模式》— 行为型模式 — 命令模式一、动机二、适用性三、结构四、参与者1、Command2、ConcreteCommand3、Client4、Invoker5、Receiver五、协作六、效果七、实现1、一个命令对象应达到何种智能程度2、支持撤销和重做3、使用C++模板类八、应用一、动机有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息。例如,用户界面包括按钮和菜单这样的对象,它们执行请求响应用户输入。但工具箱不能显式地在按钮或菜单中实现该请求,因为只有使用工具箱的应用知原创 2021-12-19 21:45:15 · 178 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 模板方法模式
《设计模式》— 行为型模式 — 模板方法模式一、动机一、动机考虑一个提供 Application 和 Document 类的应用框架。Application 类负责打开一个已有的以外部形式存储的文档,如一个文件。一旦一个文档中的信息从该文件中读出后,它就由一个 Document 对象表示。用框架构建的应用可以通过继承 Application 和 Document 来满足特定的需求。例如,一个绘图应用定义 DrawApplication 和 DrawDocument 子类等,如下所示。这里的 cre原创 2021-12-18 21:17:51 · 157 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 状态模式
《设计模式》— 行为型模式 — 状态模式一、动机二、适用性三、结构四、参与者1、Context2、State3、Concrete State五、协作六、效果1、将与特定状态相关的行为局部化,并且将不同状态的行为分割开来2、使得状态转换显式化3、State 对象可被共享七、实现1、谁定义转换2、基于表的另一种方法3、创建和销毁对象八、应用1、State(1)抽象类(2)初始状态(3)读取字符状态(4)读取转义字符状态(5)结束读取类2、Context3、测试4、对比一、动机考虑一个表示网络连接的类 TCP原创 2021-12-18 14:48:37 · 488 阅读 · 0 评论 -
《设计模式》— 行为型模式 — 责任链模式
《设计模式》— 行为型模式 — 责任链模式一、动机二、适用性三、结构四、参与者1、Handler2、ConcreteHandler3、Client五、效果1、降低耦合度2、增加了给对象指派职责的灵活性3、不保证被接受六、实现1、实现后继者链2、连接后继者3、表示请求七、应用一、动机考虑一个图形用户界面的上下文有关的帮助机制。用户在界面的任一部分点击就可以得到帮助信息,所提供的帮助依赖于点击的是界面的哪一部分及其上下文。例如,对话框中按钮的帮助信息就可能和主窗口中类似的按钮不同。如果对那一部分界面没有特定原创 2021-12-16 20:33:25 · 474 阅读 · 0 评论 -
《设计模式》— 结构型模式 — 代理模式
《设计模式》— 结构型模式 — 代理模式一、动机二、适用性三、结构四、参与者1、Proxy2、Subject3、RealSubject五、实现1、C++中的存取运算符2、代理并不总是需要知道实体的类型六、实现1、抽象类及被代理类2、代理工厂3、handler4、测试七、相似设计模式一、动机对一个对象进行访问控制的一个原因是只有我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性原创 2021-12-15 22:10:27 · 166 阅读 · 0 评论 -
《设计模式》— 结构型模式 — 装饰模式(包装器)
《设计模式》— 结构型模式 — 装饰模式(包装器)一、动机二、适用性三、结构四、参与者1、Component2、ConcreteComponent3、Decorator4、ConcreteDecorator五、协作六、效果1、比静态继承更灵活2、避免在层次结构高层的类有太多的特征3、Decorator 与它的 Component 不一样4、有许多小对象七、实现1、接口的一致性2、省略抽象的 Decorator 类3、保持 Component 的简单性4、改变对象外壳与改变对象内核八、应用举例一、动机有时原创 2021-12-14 21:43:08 · 887 阅读 · 0 评论 -
《设计模式》— 结构型模式 — 组合模式
《设计模式》— 结构型模式 — 组合模式一、问题来源二、适用性三、结构四、参与者1、Component(Graphic)一、问题来源在绘图编辑器和图形捕捉系统这样的图形应用程序中,我们可以通过组合已有的组件形成新的组件加入到工具箱中。一个简单的实现方式是为所有基本元素定义一些类,另外定义一些类作为这些图元的容器类。这种方法存在一个问题:使用这些类的代码必须区别对待图元对象与容器对象,而实际上对于用户来说,它们是一致的。对这些类区别使用,将造成设计和实现上的困难。我们可以通过组合模式递归组合,使得用户不原创 2021-12-13 22:17:54 · 839 阅读 · 0 评论 -
《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — 条件变量与原子操作
《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — mutex 与 lock一、条件变量1、意图2、条件变量的基本使用3、使用条件变量实现消费队列4、细究条件变量二、Atmoic1、使用 Atmoic2、与其他变量共同使用一、条件变量1、意图我们前面介绍的 future 主要用于传递线程的返回值和异常。但是,有时我们需要确保不同线程之间的工作流。我们可以使用一个简单的变量和锁来控制,其带来的结果就是我们需要在线程中轮询该变量的值:bool ready = false;mutex原创 2021-12-11 15:04:12 · 565 阅读 · 0 评论 -
《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — mutex 与 lock
《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发一、线程同步与并发并发问题1、出错情况(1)未同步化的数据访问(2)写至半途的数据(3)重新安排的语句2、解决问题需要的特征3、C++并发的支持一、线程同步与并发并发问题1、出错情况(1)未同步化的数据访问并行运行的两个线程分别读和写同一个数据。std:;vector<int> vec;if (!vec.empty()){ std::cout << v.front() << std::end原创 2021-12-08 21:16:27 · 1088 阅读 · 0 评论 -
《C++标准库》学习笔记 — STL — 并发 — 启动线程
《C++标准库》学习笔记 — STL — 并发一、高级接口 async() 和 Future1、实例一、高级接口 async() 和 Futureasync() 提供一个接口,让一个 (caller object) 成为一个独立线程。class future 允许你等待线程结束并获取其结果。1、实例考虑下面的操作:func1() + func2()在单线程中,整体处理时间是 func1() 所花时间加上 func2() 所花时间,再加上计算总和所花时间。如果我们尝试在多线程中实现这样的操作原创 2021-12-03 22:27:26 · 1151 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分支定界
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分支定界一、算法思想二、货箱装载一、算法思想分支定界是一种系统地搜索解空间的方法。它与回溯发的主要区别在于扩展节点的扩充方式。每个活动节点仅有一次机会变成扩展节点。当一个节点变为扩展节点时,从该节点移动一步即可到达的节点是生成的新节点。在省城的节点中,那些不可能导出最优可行解的节点被舍弃,剩余节点加入活动节点列表,然后从表中选择下一个节点作为下一个扩展节点。将选择的节点从表中删除,然后扩展。这种扩展股哟成一直持续到一个解找到了或活动表称为空表。原创 2021-12-01 13:51:31 · 1260 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法一、算法思想二、货箱装载1、问题描述2、回溯算法一、算法思想回溯法是搜索问题解的一种系统方法。前面我们做的迷宫老鼠应用使用了这种技术。回溯法首先需要定义问题的一个解空间。这个空间至少包含问题的一个最优解。在迷宫老鼠问题中,我们可以把从入口到出口的所有路径定义为解空间。在 n 个对象的0/1背包问题中,可以把2n2^n2n个长度为 n 的0/1向量集合定义为解空间。这个集合代表着向量 x 曲志伟0或1的所有可能。回溯法求解的下一步是组织解原创 2021-12-01 13:12:28 · 666 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 动态规划(二)
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 动态规划(二)一、所有顶点对之间的最短路径1、问题描述2、动态规划公式3、迭代求解一、所有顶点对之间的最短路径1、问题描述所有顶点对之间的最短路径问题是指在有向图G中,寻找每一对顶点之间的最短路径。当边上的权都不是负值的时候,所有顶点对之间的最短路径可以用 dijkstra 算法求解,每次选择 n 个顶点中的一个顶点作为源点。这个过程的时间复杂度为O(n3)O(n^3)O(n3)。使用动态规划求解该过程的算法称为 Floy 算法。Floy原创 2021-11-30 12:33:33 · 569 阅读 · 1 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 动态规划(一)
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 动态规划一、算法思想一、算法思想动态规划和贪婪法一样,对一个问题的解释一系列抉择的结果。在贪婪法中,我们依据贪婪准则做出的每一个抉择都是不可撤回的。而在动态规划中,我们要考察一系列抉择,以确定一个最优抉择序列是否包含最优抉择子序列。当最优抉择包含最优抉择子序列时,可以建立动态规划递归方程。对于背包问题,最优选择序列由最优选择子序列构成。假设 f(i, y)表示剩余容量为 y,剩余物品为 i,i + 1,···,n 的被曝问题的最优解的值,即原创 2021-11-28 16:22:57 · 588 阅读 · 0 评论 -
《C++标准库》学习笔记 — STL — 国际化
《C++标准库》学习笔记 — STL — 国际化一、字符集一、字符集常用的字符集 utf-8 是 unicode 标准的一种实现方案。utf-8 支持带 BOM 的版本。其为 byte order mark 的缩写,用以标识它所使用的是 big-endian 或 little-endian。...原创 2021-11-26 22:31:07 · 1175 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分治算法 — 排序
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分治算法 — 排序一、归并排序1、排序方法2、伪代码及最小复杂度分析一、归并排序1、排序方法可以应用分而治之来设计排序算法,把 n 个元素按非递减顺序排列。这种排序算法常用的结构式:==若 n 为1,则算法终止;否则,将序列划分为 k 个子序列(k 是不小于2的整数)。先对每一个子序列排序,然后将有序子序列归并为一个序列。将 n 个元素的序列仅仅划分为两个子序列,称为二路划分。一种二路划分是把前面 n-1 个元素放到第一个子序列中(称为A)原创 2021-11-23 12:58:19 · 474 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分治算法 — 残缺棋盘
《数据结构、算法与应用 —— C++语言描述》学习笔记 —分治算法一、 残缺棋盘1、问题描述2、求解策略一、 残缺棋盘1、问题描述残缺棋盘是一个有2k∗2k2^k*2^k2k∗2k个方格的棋盘,其中恰有一个方格残缺,如图为两个 k=2 的残缺棋盘:在残缺期盼中,要求用三格板覆盖残缺棋盘。在覆盖中,任意两个三格板不能重叠,任意一个三个班不能覆盖残缺方格,但三格板必须覆盖其他所有方格。在这种限制条件下,所需的三格板总数为(22k−1)/3(2^{2k}-1)/3(22k−1)/3。四种三格板的形状如图原创 2021-11-17 13:49:45 · 2766 阅读 · 0 评论 -
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 贪婪算法(二)
《数据结构、算法与应用 —— C++语言描述》学习笔记 — 贪婪算法(二)一、单源最短路径1、问题描述2、贪婪法求解一、单源最短路径1、问题描述给定一个加权有向图G,它的每条边 (i,j) 都有一个非负的成本 a[i][j]。一条路径的长度是该路径所有边的成本之和。寻找一条从一个给定的源顶点出发到达其他任意一个顶点的最短路径。2、贪婪法求解dijkstra算法本质上就是一种贪婪算法,可以分步产生最短路径。在每一步中,该算法都会选找一个到达新的目的顶点的最短路径。其所依据的贪婪准则如下:从一条最短路原创 2021-11-15 11:30:13 · 1220 阅读 · 0 评论