算法设计与分析
算法的特性
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
算法的表示方法
- 自然语言
- 流程图
- 程序设计语言
- 伪代码
递归算法求时间复杂度
- 展开法:将等式依次展开
- 代换法:用所猜测的值代替函数的解
分治法
将一个难以直接解决的大问题分解成一些规模较小的小问题各个击破:
- 分解
- 求解
- 合并
动态规划法
- 将待求解问题分解成若干子问题分别求解,再根据子问题的解得到原问题的解
- 分解得到的子问题往往不是独立的
- 找出最优解性质并刻画其结构特性
- 递归地定义最优解的值
- 以自底向上的方式求出最优值
- 根据最优值构造最优解
贪心算法
- 仅根据当前已有信息做出选择,重点考虑局部最优以达到全局最优
- 最优子结构
- 贪心选择性质
回溯法
- 以深度优先的方式系统地搜索问题
- 定义问题的解空间
- 确定解空间结构
- 深度优先的方式搜索解空间
分支限界法
- 以广度优先或以最小耗费优先的方式搜索解空间
- 队列式分支限界法
- 优先队列式分支限界法
概率算法
- 把随机性的选择加入到算法中,允许较小概率的错误来提高运行效率
- 数值概率算法
- 蒙特卡罗算法
- 拉斯维加斯算法
- 舍伍德算法
近似算法
放弃求最优解,而用近似最优解代替。
衡量标准:
- 算法的时间复杂度
- 解的近似程度
NP 完全性理论
研究计算问题难易以及一类特殊的难解问题的理论
P 类问题
能够以 O( n k n^k nk)的时间运行一个确定性算法得到准确答案
NP 类问题
能够以 O( n k n^k nk)的时间运行一个不确定性算法得到准确答案
NP 完全问题
能够证明用多项式时间的确定性算法得到准确答案
面向对象技术
面向对象技术
以客观世界的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与客观世界的实际比较接近,容易被人们所接受。
面向对象
- 对象:对象名、属性、操作
- 分类:所包含的方法和数据描述一组对象的共同行为和属性
- 继承:父类与子类之间共享数据和方法的机制
- 通过消息的通信:对象之间进行通信的一种构造
多态
不同的对象收到同一消息产生完全不同的结果(重载+重写+类属
)
绑定
把过程调用和响应调用所需要执行的代码加以结合的过程
动态绑定
当一个对象发送消息请求服务时,根据接受对象的具体情况将请求的操作与实现的方法进行连接
面向对象程序设计语言
- 被封装的对象
- 类和实例概念
- 类间的继承性
- 多态
程序设计范型
程序设计范型(Programming Paradigm)是人们在程序设计时采用的基本方式模型或程序设计体裁,是用程序设计语言表达各种概念和各种结构的一套设施。它不仅体现了一类语言的主要特点,更是执行设施的基本集合,或者说是关于计算机系统的思考方法。在编程的世界里,不同的程序设计范型犹如不同的工具箱,帮助程序员以不同的视角和方式解决问题。
面向对象的好处
- 解决了产品质量与生产效率之间的权衡
- 使系统具有很高的灵活性和易扩充性
- 能管理复杂性并增强伸缩性
- 把某一领域分割成各种对象分析设计更合理
- 从概念模型化到分析、设计、编码可以实现无缝传递
- 通过封装进行信息隐蔽有助于建立安全的系统
典型的面向对象设计语言
- Smalltalk
- Eiffel
- C++
- Java
类的特征
- 同一个类的不同实例具有相同的数据结构和规律相同的行为
- 同一个类的不同实例可以持有不同的值因而可以具有不同的状态
- 实例的初始状态可以在实例化时确定
消息传递
使对象具有交互能力的主要模型
对象自身引用(this)
- 值使得方法体中引用的成员名与特定的对象相关
- 类型则决定了方法体被实际共享的范围
虚拟函数
只给出方法的定义不给出实现过程,供其子类重置(overriding
)
类属
- 类的模版
- 参数多态机制
- 不限定成员的类型,具体对象再赋予具体类型
类库
预先定义的程序库,以程序模块的形式按照类层次结构把一组类的定义和实现组织在一起
抽象类
无实例的类,以供继承
面向对象分析
- 认定对象
- 组织对象
- 描述对象间的相互作用
- 定义对象的操作
- 定义对象的内部信息
面向对象设计
设计分析模型,实现相应源代码
面向对象软件的测试
- 算法层
- 类层
- 模版层
- 系统层
面向对象的方法
- OOA 方法:主题层,对象类层,结构层,属性层,服务层
- OOD 方法:问题域部件,人机交互部件,任务管理部件,数据管理部件
- Booch 的 OOD 方法:标识类和对象,确定他们的含义,标识他们之间的关系,说明每一个类的界面和实现
- OMT(面向对象建模技术):对象模型,动态模型,功能模型(分析,系统设计,对象设计,实现)
- UML(统一建模语言):事务(结构事务、行为事务、分组事务、注释事务),关系(依赖、关联、泛化、实现),图(类图、对象图、用例图、交互图、状态图、活动图、构建图、部署图)
设计模式四要素
- 模式名称
- 问题
- 解决方案
- 效果
设计模式分类
- 创建型(抽象了实例化过程,帮助系统独立于如何创建、组合和表示它
的那些对象,如 Singleton 模式:保证类只能有一个实例) - 结构型(采用继承机制灵活地组合类和对象以获得更大的结构)
- 行为型(使用继承机制在类间分派行为,描述对象或类的模式以及其通信模式,如 Observer 模式:一旦模型发生变化所有视图都会得到通知)
面向对象设计原则
一、单一职责原则(SRP)
单一职责原则强调一个类应该只有一个引起它变化的理由,或者说,一个类应该只有一个职责。这一原则有助于降低类的复杂度,提高代码的可读性和可维护性。当类的职责过于复杂时,代码修改和扩展将变得困难。通过遵循单一职责原则,开发者可以将复杂的类拆分成多个简单的类,每个类只负责一个特定的职责,从而使得系统更加清晰和易于管理。
二、开放封闭原则(OCP)
开放封闭原则要求软件实体(类、模块、函数等)应该是可扩展的,但不可修改的。这意味着在现有功能不受影响的情况下,软件实体应该能够通过扩展来添加新功能。这一原则有助于确保软件系统的稳定性和可维护性。为了实现开放封闭原则,开发者需要采用抽象和接口等技术,使得软件实体在保持内部封闭性的同时,能够对外开放其扩展点。
三、里氏替换原则(LSP)
里氏替换原则指出,子类必须能够替换其父类而不会导致程序崩溃或产生不正确的结果。这一原则确保了软件系统的继承关系具有良好的行为特性,即子类在继承父类的同时,不会破坏父类的行为。遵循里氏替换原则有助于构建稳定的继承体系,降低系统因继承关系而引发的风险。
四、接口隔离原则(ISP)
接口隔离原则要求将庞大的、臃肿的接口拆分成更小的、更具体的接口,使得客户端只需要知道它们感兴趣的方法。这一原则有助于降低系统的耦合度,提高代码的可重用性和灵活性。通过遵循接口隔离原则,开发者可以设计出更加符合实际需求、易于理解和维护的接口。
五、依赖倒置原则(DIP)
依赖倒置原则强调高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这一原则有助于降低系统各层之间的耦合度,提高系统的可扩展性和可维护性。通过引入抽象层,开发者可以更加灵活地修改和扩展系统,而无需对高层模块进行大量修改。
六、迪米特法则(LoD)
迪米特法则又称最少知道原则,它要求一个对象应该对其他对象保持最少的了解。这一原则有助于降低系统的耦合度,提高系统的模块化和封装性。通过遵循迪米特法则,开发者可以设计出更加清晰、易于理解和维护的软件系统。