自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 建造者模式

建造者(生成器Builder)模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。思路:先把构建过程独立出来,在建造者模式中把它称为指导者,由他来指导装配过程,但不负责每步具体的实现。能具体实现每步的对象,称之为建造者或者生成器。建造者(Builder)角色:定义创建一个Product对象所需的各个部件的操作。具

2020-08-11 19:27:18 170

原创 外观模式

外部与一个子系统的通信必须通过一个统一的外观(Facade)对象进行,这就是外观模式。外观模式提供一个高层次的接口,使得子系统更易于使用。外观模式的外观类将客户端与子系统的内部复杂性分隔开。外观(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。如果一个系统有好几个子系统的话,每一个子系统有一个外观类,整个系统可以有数个外观类。应用

2020-08-09 18:03:51 141

原创 模板方法模式

模板方法模式模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心。模式定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。代表具体逻辑步骤的方法称做基本方法(primitive method)将这些基本方法总汇起来的方法叫做模板方法(template method)应用场景当要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同的时候,通常要考

2020-08-09 17:34:58 149

原创 原型模式

原型(Prototype)模式原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。浅拷贝:只负责克隆按值传递的数据(比如基本数据类型、String类型)。深拷贝:除了浅拷贝要克隆的值外,还负责克隆引用类型(属性的类型也是对象)的数据。执行深拷贝后,原来的对象和新创建的对象不会共享任何东西;改变一个对象对另外一个对象没有任何影响。Prototype

2020-08-09 13:43:47 92

原创 工厂方法模式

Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。优点:工厂类中包含了必要的逻辑判断,去除了客户端与具体产品的依赖。缺点:在某种程度上违背了开放一封闭原则。对工厂类过于依赖。工厂方法(Factory Method)模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这使得工厂方法模式可以允许系统在不修改工厂角色的情况

2020-07-30 12:25:44 84

原创 代理模式

代理模式(Proxy Pattern)抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题。真实主题(RealSubject)角色:定义了代理角色所代表的真实对象。代理模式给某一个对象提供一个替身或占位符,以控制对这个对象的访问。在一些情况下,一个客

2020-07-28 20:02:23 83

原创 装饰模式

装饰(Decorator)模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。具体构件(Concrete Component)角色:实现组件对象接口,通常就是被装饰器装饰的对象。装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。具体装饰(Concrete Decorator)角色:负责给构件对象“贴

2020-07-28 14:44:21 83

原创 常见面向对象设计原则

单一职责原则(SRP)Single Responsibility PrincipleThere should never be more than one reason for a class to change.就一个类而言,应该仅有一个引起它变化的原因(职责)。难点在于如何区分职责、职责的粒度问题。软件设计真正要做的内容,就是发现职责并把那些职责相互分离。单一职责适用于接口、类,同时也适用于方法。开放一封闭原则(OCP原则)Open-Closed Principle一个软件实体应当对扩展开

2020-07-21 19:52:53 120

原创 第二章 策略模式

类的划分原则面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 策略模式(与简单工厂类似)策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类( Concrete Strategy)中提供。由于算法和环境独立开来,算法的增减,修改都不会影响环境和

2020-07-21 14:43:25 211

原创 第一章 简单工厂模式

面向对象的优点:可维护、可复用、可扩展、灵活性好应考虑:通过封装、继录、多态把程序的耦合度降低,开始用设计模式使得程序更力的灵活,容易修改,并且易于复用。工厂模式工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事允知道每次要实例化哪一个类。工厂模式有以下几种形态:简单工厂(Simple Factory)模式工厂方出(Factory Method)模式抽象工厂(Abstract Factory)模式 简单工厂模式Simple Factory模式根据提

2020-07-20 12:54:35 155

原创 算法设计与分析---第6章 回溯算法

回溯法是一种组织搜索的一般技术,有“通用的解题法”之称,用它可以系统的搜索一个问题的所有解或任一解。有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。6.1 回溯算法的理论基础6.1.1 问题的解空间应用回溯法求解时,需要明确定义问题的解空间。问题的解空间应至少包含问题的一个(最优)解。6.1.2 回溯法的基本思想在生成解空间树时,定义以下...

2020-04-21 23:40:37 1067

原创 算法设计与分析---第5章 贪心算法

2020-04-19 12:56:43 1476

原创 算法设计与分析---第4章 动态规划

动态规划的基本思想动态规划算法通常用于求解具有某种最优性质的问题。基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将...

2020-04-14 23:59:34 729

原创 算法设计与分析---第三章 递归与分治

分治法的设计思想将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。更一般地说,将要求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够小,很容易求出其解为止,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解。启发式规则:1、平衡...

2020-04-14 00:19:52 376

原创 算法设计与分析---第3章 递归与分治策略

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题(1<k≤n),且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。3.1 递归算法程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。递...

2020-03-27 00:08:39 2064

原创 算法设计与分析---第二章 递推算法

递推法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。【例1】数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。  1、 一步可沿...

2020-03-24 22:42:13 465

原创 算法设计与分析---第1章 绪论

算法理论的两大论题:算法设计—对于一个问题如何设计一个有效的算法算法分析—如何评价或判断一个算法的优劣1.1.1 为什么要学习算法理由1:算法——程序的灵魂问题的求解过程:分析问题→设计算法→编写程序→整理结果程序设计研究的四个层次:算法→方法学→语言→工具理由2:提高分析问题的能力算法的形式化→思维的逻辑性、条理性1.1.2 算法及其重要特性算法(Algorit...

2020-03-23 23:41:46 951

原创 课堂笔记:插入类排序

插入排序的主要操作是插入其基本思想是: 每次将一个待排序的记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序为止。插入类排序方法有以下两种: 1、直接插入排序 2、希尔排序直接插入排序基本思想:在插入第 i(i>1)个记录时,前面的 i-1个记录已经排好序。需解决的关键问题?(1)如何构造初始的有序序列?(2)如何查找待插入记录的插入位置?直接插入排序过程示例...

2020-02-21 23:09:47 142

原创 课堂笔记:排序的基本概念

排序:给定一组记录的集合{r1, r2, ……, rn},其相应的关键码分别为{k1, k2, ……, kn},排序是将这些记录排列成顺序为{rs1, rs2, ……, rsn}的一个序列,使得相应的关键码满足ks1≤ks2≤……≤ksn(称为升序)或ks1≥ks2≥……≥ksn(称为降序)。正序:待排序序列中的记录已按关键码排好序。逆序(反序):待排序序列中记录的排列顺序与排好序的顺序正好相...

2020-02-17 20:52:59 398

原创 课堂笔记:散列表的查找技术

散列函数的构造:直接定址法、除留余数法、数字分析法、平方取中法、折叠法(分段叠加法)冲突处理方法:开放定址法、链地址法、建立公共溢出区概 述散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。散列函数:将关键码映射为散列表中适当存储...

2020-02-15 22:47:50 819

原创 课堂笔记:树表的查找技术:平衡二叉树(AVL树)

平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:⑴ 根结点的左子树和右子树的深度最多相差1;⑵ 根结点的左子树和右子树也都是平衡二叉树。...

2020-02-12 19:45:30 104

原创 课堂笔记:树表的查找技术:二叉排序树(BST)

线性表查找是静态的查找,要在线性表上进行动态查找,存在以下的问题:无序顺序表上进行动态查找,插入操作简单,但查找的复杂性高有序顺序表上进行动态查找,查找的时间复杂性好,但是插入操作时间复杂性高单链表上进行动态查找,插入操作简单,但查找操作复杂性高解决办法: 采用二叉树这种数据结构,实现动态查找二叉排序树(Binary Search Tree)二叉排序树(也称二叉查找树):或者是一棵空的...

2019-12-03 00:10:27 339

原创 课堂笔记:线性表的查找技术

顺序查找:普通的顺序查找方法、带监视哨的顺序查找方法折半查找:折半查找的判定树#include using namespace std; const int MaxSize = 100; class LineSearch{ public: LineSearch(int a[], int n); ~LineSearch() {} int SeqSearch(int k)...

2019-12-02 23:07:20 143

原创 课堂笔记:查找的基本概念

查找的基本概念列表:由同一类型的数据元素组成的集合。关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。键值:关键码的值。主关键码:可以唯一地标识一个记录的关键码。次关键码:不能唯一地标识一个记录的关键码。查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。静态查找 ...

2019-12-02 21:55:49 146

原创 课堂笔记:有向无环图及其应用、图的连通性

AOV网AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网。AOV网与拓扑排序AOV网特点:1.AOV网中的弧表示活动之间存在的某种制约关系。2.AOV网中不能出现回路 。拓扑排序拓扑序列: 设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1, v2, …, vn称为一个拓扑序列,当且仅当满足下列...

2019-12-02 21:17:23 911

原创 课堂笔记:最短路径

在非网图中,最短路径是指两顶点之间经历的边数最少的路径。在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。单源点到其他顶点的最短路径:Dijkstra方法,O(n2)任意一对顶点之间的最短路径:Floyed方法,O(n3)单源点最短路径问题问题描述:给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径。应用实例——计算机网络传输的问题:怎样找到一种最...

2019-12-01 16:23:18 452

原创 课堂笔记:最小生成树

最小生成树(minimal spanning tree)生成树的代价:设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价。最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树。MST( minimum spanning tree)性质假设G=(V, E)是一个无向连通网,U是顶点集V的一个非空子集。若(u, v)是一条具有最小权值的边,其中u∈U,v∈V-...

2019-11-30 01:37:48 332

原创 课堂笔记:图的存储结构及实现

邻接矩阵(数组表示法)基本思想: 用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。无向图的邻接矩阵无向图的邻接矩阵的特点:主对角线为0且一定是对称矩阵。如何求顶点i的度:邻接矩阵的第i行(或第i列)非零元素的个数。如何判断顶点 i 和 j 之间是否存在边:测试邻接矩阵中相应位置的元素arc[i][j]是否为1。如何求顶点 i 的所有邻接点:...

2019-11-28 00:16:47 452

原创 课堂笔记:图的逻辑结构

图的定义图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E),其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合。在线性表中,元素个数可以为零,称为空表; 在树中,结点个数可以为零,称为空树; 在图中,顶点个数不能为零,但可以没有边。若顶点vi和vj之间的边没有方向,则称这条边为无向边,表示为(v...

2019-11-26 01:11:15 515

原创 Python学习笔记(面向对象的程序设计)

面向对象的程序设计类和对象是面向对象编程的两个主要方面:类创建一个新类型,而对象是这个类的实例。①类的定义②对象方法的定义③使用__init__方法如何进行面向对象的程序设计?(1)类的定义在Python语言中,类使用class关键字创建。类的属性和方法被列在一个缩进块中。(2)对象方法的定义类可以拥有像函数一样的方法,这些方法与函数是作为类生成的对象所拥有的行为来使用的。(3...

2019-11-25 00:03:16 175

原创 课堂笔记:树、森林与二叉树的转换、哈夫曼树

树、森林与二叉树的转换树转换为二叉树:1、兄弟加线;2、保留双亲与第一孩子连线,删去与其他孩子的连线;3、顺时针转动,使之层次分明。树的前序遍历等价于二叉树的前序遍历,树的后序遍历等价于二叉树的中序遍历。森林转换为二叉树:⑴ 将森林中的每棵树转换成二叉树;⑵ 从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来后,此时所得到的二叉树就是由...

2019-11-24 16:41:04 408

原创 课堂笔记:二叉树算法设计练习

遍历二叉树是二叉树各种操作的基础, 遍历算法中对每个结点的访问操作可以是多种形式及多个操作, 根据遍历算法的框架,适当修改访问操作的内容,可以派生出很多关于二叉树的应用算法。设计算法求二叉树的结点个数。void Count(BiNode *root){ if (root) { Count(root->lchild); number+ +; /...

2019-11-19 01:10:55 215

原创 课堂笔记:二叉树的存储结构及实现

顺序存储结构二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置(下标)应能体现结点之间的逻辑关系——父子关系。...

2019-11-17 18:16:19 464

原创 课堂笔记:二叉树的逻辑结构

二叉树的定义二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点:1、每个结点最多有两棵子树;2、二叉树是有序的,其次序不能任意颠倒。注意:二叉树和树是两种树结构。二叉树的基本形态:空二叉树、只有一个根结点、根结点只有右子树、根结点只有左子树、根结点同时有左右子树。特殊的二叉...

2019-11-14 00:28:57 623

原创 课堂笔记:树的逻辑结构、树的存储结构

树的逻辑结构树的定义树:n(n≥0)个结点的有限集合。当n=0时,称为空树;任意一棵非空树满足以下条件:⑴有且仅有一个特定的称为根的结点;⑵当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1,T2,… ,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。树的定义是采用递归方法树的基本术语结点的度:结点所拥有的子树的个数。树的度:树中各结点度的...

2019-11-11 21:12:57 1904

原创 课堂笔记:多维数组、矩阵的压缩存储、广义表

线性表——具有相同类型的数据元素的有限序列。将元素的类型进行扩充:(多维)数组——线性表中的数据元素可以是线性表,但所有元素的类型相同。广义表——线性表中的数据元素可以是线性表,且元素的类型可以不相同。数组的定义:数组是由一组类型相同的数据元素构成的有序集合,每个元素受n(n≥1)个线性关系的约束,并称该数组为 n 维数组。数组的特点:元素本身可以具有某种结构,属于同一数据类型;数组是一...

2019-11-05 00:05:41 337

原创 课堂笔记:字符串存储、模式匹配

串的逻辑结构串:零个或多个字符组成的有限序列。串长度:串中所包含的字符个数。空串:长度为0的串,记为:" “。非空串通常记为:S=” s1 s2 …… sn " 其中:S是串名,双引号是定界符,双引号引起来的部分是串值 ,si(1≤i≤n)是一个任意字符。子串:串中任意个连续的字符组成的子序列。主串:包含子串的串。子串的位置:子串的第一个字符在主串中的序号。串的存储结构顺序串:用...

2019-10-28 21:05:08 205

原创 课堂笔记:栈和队列

栈的逻辑结构栈:限定仅在表尾进行插入和删除操作的线性表。空栈:不含任何数据元素的栈。允许插入和删除的一端称为栈顶,另一端称为栈底。栈的操作特性:后进先出。注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。栈的顺序存储结构及实现利用数组实现栈的顺序存储,确定用数组的哪一端表示栈底,附设指针top指示栈顶元素在数组中的位置。进栈:top加1,出栈:to...

2019-10-16 00:14:43 188

原创 课堂笔记:循环链表、双向链表、静态链表

循环链表:将单链表或者双链表的头尾结点链接起来,就是一个循环链表。从循环表中任一结点出发,都能访问到表中其他结点。特点:1、首尾相接的链表。2、可以从任一节点出发,访问链表中的所有节点。3、判断循环链表中尾结点的特点:q->next==first空表的构造:template<class T>CycleLinkList<T>:: CycleLinkList( )...

2019-10-04 23:23:45 360

原创 课堂笔记:顺序表、单链表

线性表( Linear List )的定义是零个或多个具有相同类型的数据元素的有限序列。数据元素的个数定义为线性表的 长度 。长度等于零时称为空表,一个非空表通常记为 L = ( a 1 , a 2 ,……, a n ) 其中, a i ( 1 ≤ i ≤ n )称为数据元素,下标 i 表示该元素在线性表中的位置或序号, 称元素 a i 位于表的第 i 个位置,或称 a i 是表中的第 i 个元素...

2019-09-23 23:18:40 140

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除