- 博客(76)
- 收藏
- 关注
原创 跳表
作用/目的跳表作为一种数据结构通常用于取代平衡树。起因平衡树可以用于表示抽象的数据类型如字典和有序链表,它通过树旋转(Tree Rotation)操作强制使树结构保持平衡来保证节点搜索的效率。在数据为随机插入的情况下,平衡树性能表现良好;但数据为顺序插入或者需要删除节点的情况下,平衡树的性能就会有些糟糕。跳表可以作为平衡树的一种替代选择。它使用随机的平衡策略取代平衡树严格的强制的树平衡策略。因此它具
2017-12-07 16:23:28 353
原创 复杂链表的复制
问题: 请实现一个函数,复制一个复杂链表,在复杂链表中,每个节点除了有一个指向下一个节点的指针,还有一个指向该链表的任意节点的指针,或者该指针指向NULL。 eg: 复制该链表分为三步: 1.复制原始链表的任意节点,N并创建一个新的节点N’,在把节点连接到N的后面, 2.原始链表上的节点N的sibling指针指向S则,对应的复制节点的N’的silbing指针指向S的复制节点S’
2017-11-30 13:05:03 367
原创 java中的注解
@Override-在java.lang.Override中,此注解只是用于修饰方法,表示一个方法声明打算重写超类中的一个方法声明。@Deprecated-定义在java.lang.Deprecated中,此注释可用于修饰方法,属性,类,不鼓励程序员使用这样的元素,通常是因为他很危险或者存在更好的选择。@ SuppressWarring-定义在java.lang.SuppressWarnings中,
2017-11-30 08:46:33 378
原创 二叉树中和为某一值的路径
题目: 输入一棵二叉树和一个整数,打印出二叉树和中节点值和为输入整数的所有路径,从树的根节点开始往下一直到叶子节点所经过的节点形成的一条路径。 输入的二叉树如图,输入的整数为22。 则打印两条路径: 10、12 10、5、7 思路:用前序遍历的方式访问某一个节点时,把该节点添加到路径上,并累加该节点的值,如果该节点为叶子节点并且累加的值正好为目标值,则输出该路径,如果
2017-11-29 10:38:09 243
原创 中介者模式(行为模式)
概念: 用一个中介对象来封装一系列的对象交互,中介者使用各对象不需要显示相互引用,从而降低耦合,而且可以独立地改变他们之间的交互。 适用于:用一个中介对象,封装一系列对象的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换。 模式有点: 1.将系统按照功能分割成更小的对象,符合类的最小设计原则, 2,对关联对象的集中控制 结构图: 需求
2017-11-13 17:35:18 342
原创 备忘录模式
Originator(原生者) 需要被保存状态以便恢复的那个对象。 Memento(备忘录) 该对象由Originator创建,用来保存Originator的内部状态 Caretaker(管理者) 负责在适当的时间保存/恢复Originator对象的状态 适用于: 在不破坏疯转的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到之前保存的状态。
2017-11-13 00:36:34 363
原创 原型模式
概念: Prototype模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型模式一样的数据。 1)由原型对象自身创建对象,也就是说,对象的创建这一动作发自原型对象的本身。 2)目标对象是原型对象的一种克隆,也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象有相同的值。 3)根据对象克隆深度层次的不同
2017-11-12 20:34:57 220
原创 建造者模式
概念: Bulider模式也叫做建造者模式或者生成器模式。 Bulider模式是一种对象创建型模式,用来隐藏复合对象的创建过程,他把符合对象的创建过程加以抽象,通过子类继承和重载的方式,动态的创建具有复合属性的对象。 对象的创建:Bulider模式是为对象的创建而设计的模式,创建的是一个复合对象;被创建的对象为具有一个复合属性的复合对象,关注对象创建的各部分创建过程,不同的生成器对对象的属性有
2017-11-12 19:01:06 293
原创 寻找二叉树的第k大节点
需求: 给定一棵二叉树,求出第k大的节点。 根据二叉树的中序遍历中序遍历即可找到第k大的节点。 实现: 节点定义:typedef struct node{ int data; struct node *left; struct node *right;}BTNode;BTNode* searchTagCore(BTNode *root, int* k){
2017-11-06 13:39:57 2529
原创 数的子结构
需求: 输入两颗二叉树A和B,判断B树是不是A树的子结构。如果是返回1,不是返回0。 思路 解决这个问题可以大致分为两步: 第一步:在树A中找到和树B的根节点的值一样的节点R, 第二步:判断树A中以R为根节点的子树是不是包含和树B一样的子结构。 因为在计算机中,如果两个浮点树判断大小会出现误差。不能直接写x==y 所以如果两个数的差值如果很小,那么我们就认为这两个数字是相等的。
2017-11-05 21:16:49 296
原创 蛇形打印二叉树
需求 请实现一个函数实现蛇形打印二叉树,即第一行从左到右的顺序打印,第二行从右到左顺序打印,第三行从左到右……. eg: 上图二叉树打印结果为: 8 10 6 5 7 9 11 思路: 按照蛇形打印二叉树需要两个栈,在打印某一层节点时,把下一层节点存储在另一个栈中,如果打印的是奇数层,则先保存左子节点,在保存右子节点,如果是偶数层,则先保存右
2017-11-04 23:14:20 2777
原创 从上到下打印二叉树
二叉树如图: 需求1 不分行从上到下打印二叉树 该事例打印结果为:8,6,10,6,7,9,11 思路: 每次打印一个节点的时候,如果该节点有子节点,那么就将子节点则吧该节点的子节点放到队列的末尾,接着到队尾的头部取出最早入队列的节点,重复前面的打印操作,直到队列中所有的元素都打印完毕。 如图: 队列的数据结构选择: 因为我们不知道二叉树最多一层的节点的节点个数,所以在这里用
2017-11-03 23:45:28 525
原创 判断一个序列是否是一棵二叉树的后序遍历序列(分治算法)
需求: 输入一个整数数组,判断该数组是不是某个二叉树的后序遍历的结果,如果是,返回1,否则返回0。 线索: 在后序遍历序列中,最后一个数字是当前二叉树的根节点,所以序列中的数字可以分为三部分,根,左子树,右子树,左子树的值都小于根节点,右子树的值都大于根节点,所以可以根据这个信息找到序列中左子树的长度,之后判断当前二叉树的右子树是否满足条件。如果满足条件,则开始分治,进一步判断左子树和右子树的
2017-11-02 22:17:36 802
原创 二叉树转换为双向链表
需求 输入一棵二叉搜索树,将该二叉树转换成一个排序的双向链表, (要求:不能创建任何新的节点只能调整树中指针的指向) 例如: 转换成双向链表后: 线索 在二叉搜索树中,左子树的值总是比根节点,右子树的值总是大于根节点,因此我们在将二叉搜索树变换成双向链表时,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为指向后一个节点的指针。 为了记录已经调
2017-11-02 13:14:37 1726
原创 归并排序(分治算法)
之前分享过一道算法叫做:寻找一个序列中的最大子序列和,如果那个算法想通了,那么归并排序开起来会显得比较简单 归并算法基本思路 将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。综上可知:归并排序其实要做两件事:(1)“分解”——将
2017-10-31 08:55:58 3846
原创 策略模式(行为类模式)
结构图 案例; 定义一组算法,将每个算法都封装起来,并使他们之间可以互换。 实现:class Strategy{public: virtual void crypt() = 0; virtual ~Strategy(){}};class AES :public Strategy{public: virtual void crypt(){ co
2017-10-25 22:33:26 268
原创 桥接模式(构造型设计模式)
概念 Bridge模式又叫做桥接模式,是构造型的设计模式之一,Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任,他的主要特点是保持各个部分的独立性以及对他们的拓展功能。 结构图 需求 现有发动机Engine4400c,Engine4500c,车BMW5 ,BMW5 ,通过桥接实现车和发动机的任意组合。class Engine{publi
2017-10-25 22:24:05 308
原创 组合模式(结构型设计模式)
结构图 单个对象和组合对象的使用具有一致性,将对象组合成树状结构以表示“整体—部分” 文件和文件夹的案例: 实现class IFile{protected: string name;public: virtual void display() = 0; virtual ~IFile(){}};class File :public IFile{public
2017-10-25 22:14:50 260
原创 模板模式(行为型模式)
结构图 类中的方法通过虚化的方式,使得在客户端无法访问,只能通过另一个可以访问的函数,通过this进行调用。 实现class Base{protected: virtual void primitive1() = 0; virtual void primitive2() = 0;public: void template1(){ this->pri
2017-10-25 22:08:14 209
原创 访问者模式(行为模式)
概念 分离对象的数据和行为,使用访客模式,可以不修改类的情况下,增加操作角色和职责。 结构图 优点: 1.访问者模式使得增加新的操作变得很容易,如果一些操作依赖于一个复杂的结构对象的话,那么一般而言操作会变得很复杂,而使用访问者模式,增加新的操作意味着增加一个新的访问者类,因此变得很容易。 2.访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个节点类中。 3.访问者模式可以
2017-10-25 11:13:41 318
原创 二叉树的下一个节点
题目 给定一棵二叉树中的一个节点,如何找出中序遍历列的下一个节点?(树中除了有左右节点的指针还有一个指向父节点的指针) 上图的二叉树中序遍历序列为; [d,b,h,e,i,a,f,c,g] 观察二叉树的结构可知; 如果给定的节点有右子树,那么他的下一个节点是他的右子树的最左子节点 如果给定的节点没有右子树,如果他的节点是他父节点的左节点,那么他的下一个节点就是他的父节点 如果该给定的节
2017-10-21 14:27:04 181
原创 责任链
Chain of Responsibility 模式也叫责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来完成同一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。 结构图 具体应用 软件窗口的消息传递。 servlet容器的过滤器(Fliter)框架实现 eg: 现需要造车,造车分为三部分:早车头,造车身,造车尾。利用职责连实
2017-10-21 14:06:32 256
原创 快速排序(分治算法)
步骤 1.每次将序列中的第一个元素作为一个一个基准, 2.在序列的左边找到第一个比基准元素大的值,在序列的右面找到第一个比序列小的值,交换这两个值,使得在这两个值的两边元素分别小于、大于基准元素。继续在序列中寻找,之后再交换,最终实现在某个位置,该元素的值(包括该元素)都比基准元素小,该元素的右面的元素值都比基准元素大。将这个值和基准元素进行交换,实现在基准元素的左边,元素值都比基准元素小,基准
2017-10-20 13:24:01 1317
原创 代理模式(结构型设计模式)
Proxy模式又叫做代理模式,是结构型的设计模式之一,他可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。 所谓代理,是指具有与代理元(被访问的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类进行交互,而代理一般在交互模式过程中(交互前后),进行某些特别的处理。 结构图: eg: 现有一个红酒厂,需要代理卖红酒,客户端通过代理,得到红酒。 实现:class B
2017-10-13 13:39:14 280
原创 idea常用快捷键
IntelliJ Idea 常用快捷键列表Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 Ctrl+[ OR ],可以跑到大括号的开头与结尾 Ctrl+F12,可以显示当前文件的结构 Ctrl+F7,可以查询当前元素在当前文件中的引用,然
2017-10-09 21:43:27 164
原创 二叉树对称问题
1.镜像二叉树: 如图: 需求:编写一个函数,传入一棵二叉树,将该二叉树变成他的镜像。 交换过程: 总结上面的过程:先前序遍历二叉树,如果是叶子节点,则两个兄弟节点就进行交换 。 实现:void mirrorRecurisively(BTNode *root){ if (!root){ return; } else{ BTNo
2017-10-09 20:50:31 622 1
原创 求序列中最大子序列和(分治算法)
分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 分治思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成
2017-10-09 10:28:40 9827
原创 适配器模式(结构型设计模式)
概念 通过适配器模式可以改变已有类的接口。 适配器的意义 那不同接口调用转换成相同接口的调用,并实现了代码的复用 结构图: 需求: 现有一个家用电器需要使用18V的电源,但是只有220V的电源,通过适配器完成家用电器的使用。 代码实现:class Current18V{public: virtual void useCurrent18V() = 0;};class C
2017-10-06 22:35:41 497
原创 工厂模式
1.简单工厂模式:(简单工厂模式不属于23种设计模式) 结构图: 优点:统一接口 缺点:违背了“开闭原则” 代码实现: 生产类:class Product{public: virtual void getName() = 0;};class ProductA:public Product{public: void getName(){ cout
2017-10-06 21:22:55 381
原创 单例模式
单例模式是一种对象创建模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。 类图 为什么使用单例模式? 在应用开发中,常常有如下需求: *在多线程之间只初始化一个资源。 *在整个程序空间中使用全局变量共享资源。 *在大规模系统中,为了性能考虑,以及需要节省兑现的创建时间等等。 懒汉式class Singelton{priv
2017-10-05 22:04:17 167
原创 设计模式相关基础知识
设计模式的最终目的:高内聚,低耦合 设计模式的原则: 1)开放封闭原则: 类的改变是通过增加代码进行的,而不是修改代码 案例展示: 2)单一的职责原则: 类的职责要单一,只对外提供一种功能,而引起类变化的原因都应该只有一个 3)依赖倒置原则: 依赖于(抽象)接口,不要依赖具体的实现(类),也就是针对接口编
2017-10-05 20:53:01 293
原创 马踏棋盘(回溯算法)
马可以走的位置如图: 要求: 找到所有马从任意一个位置出发遍历整个棋盘的一条路径 算法实现:#include<stdlib.h>#include<stdio.h>int chessboard[12][12];//定义棋盘,//马走的方向int move[8][2] = { { 2, 1 }, { 1, 2 }, { -1, 2 }, { -2, 1 }, { -2, -1 }, { -1
2017-10-05 13:40:52 2287
原创 迷宫(回溯算法)
要想解决迷宫问题,首先搞明白八皇后,迷宫问题是回溯和贪心的产物。 题目:现有一个迷宫如图: 黄色五角星为迷宫的起点,红色五角星为迷宫的终点。 要求:找到从起点到终点的所有路线。 思路:我们的目的为了到达终点,所以一定要向着终点的方向出发。 因为迷宫的终点在起点的右下角。 所以我们选择路径时先考虑向下走, 走不通考虑向右走, 走不通考虑向上, 最后考虑向左。 这样就会总有一次到
2017-10-05 13:29:43 2752
原创 重建二叉树
需求:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。 假设:该二叉树没有重复数字。 遍历二叉树的规律 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。 在中序遍历序列中,根节点的值在序列中间,左子树的节点的值位于根节点值的左边,而右子树的节点的值位于根节点的右边。 eg: 该二叉树如图: 根据前序遍历找到根节点,之后根据中序遍历确定该根节点的左子树
2017-09-30 23:33:35 216
原创 八皇后问题
问题描述 在8*8的国际象棋棋盘中,摆放8个皇后,使得每一行、每一列、每一条斜线上都只有一个皇后。 问题分析 先在第一行的第一个位置摆放第一个皇后 接着在第二行顺序查找摆皇后的位子 以此类推: 下一行没有符合摆放皇后的位置。说明上一行摆放的皇后位置不合适。返回上一行重新摆放皇后。(开始回溯) 当前行依旧摆放不了皇后,继续回溯 以此类推直到八个皇后都放到棋盘上。
2017-09-25 12:31:57 333
原创 Huffman编码(二)链表实现
链表实现哈夫曼编码相比数组比较简单。//创建哈夫曼节点typedef struct node{ char word; int weight; struct node *left, *right;}HuffmanNode;//创建哈夫曼树HuffmanNode* creatHuffmanTree(char word[], int weight[]){ int l
2017-09-19 00:34:08 803
原创 Huffman编码(一)数组实现
哈夫曼编码简介: 一定能获得最优解的算法。 应用领域:压缩 知识扫盲 1.节点的权(W):赋予叶子节点有意义的值 2.节点的路径长度(L):从根几点到当前节点的边的个数。 3.节点的带权路径长度:W*L 4.一棵二叉树的带权路径长度:所有叶子节点的带权路径长度之和 哈夫曼树(最优二叉树) 一棵二叉树的带权路径长度之和最小。
2017-09-18 01:09:31 1351
原创 对象的序列化
将多个对象保存到文件中,称为对象的序列化 注意序列化的对象实现Serializable接口 ObjectOutputStream: 构造函数: ObjectOutputStream(new FileOutputStream(“……”)); 常用方法: readObject();——-反序列化 wirteObject();——序列化 /* * 对象
2017-09-15 00:03:49 152
原创 SequenceInputStream
SequenceInputStream 序列流 将多个流以集合的方式合并到一个流中 需求: 将1.txt,2.txt,3.txt中的一个数据合并到一个文件中 效率比较低的方法:private static void lowMethod() throws IOException { Vector<FileInputStream> v =new Vector<FileI
2017-09-14 23:43:19 169
原创 Properties总结
Propertiese特点: 1. 该集合中的键和值都是字符串 2. 集合中的数据都可以保存到流中,或者从流中获取,通常该集合用于操作以键值对形式存在的配置文件 常用方法: 存储元素/修改元素:setProperty(String key,String value); 搜索元素:String getProperty(String key);—-使用此属性列表中指定的键搜索属性 取出元
2017-09-14 15:15:06 226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人