2013年10月21日

摘要: /// /// 找出二叉树中和为某一值的所有路径 /// class BinarySearch { public static void Do() { int[] tree = { 10,5,8,4,7,1}; ... 阅读全文
posted @ 2013-10-21 17:23 豆沙包没有肉 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 通过中序遍历可以得到一个有序的序列,不创建一个节点实现有序双向列表。 /// /// 二叉查找树变成有序的双向链表,不创建新的节点 /// public class BST2LinkList { public static void Convert() { Node[] tree = CreateBST(); Node head = null; MidddleOrderSearch(tree, 0, ref head); Console.Read();... 阅读全文
posted @ 2013-10-21 15:08 豆沙包没有肉 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 二叉查找树:如果左子树不为空,那么左子树上的所有节点都小于根节点; 如果右子树不为空,那么又子树上的所有节点都大于根节点; 左右子树也是二叉排序树。在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:(1)第一部分是左子树结点的值,它们都比根结点的值小(2)第二部分是右子树结点的值,它们都比根结点的值大(3)递归左子树(4)递归右子树代码: public class BinarySearchTrees { //有序遍历结果的特点是,最后一个元素是根元素,根据这个根元素会把其他的子序列按照大小分成两个部分, ... 阅读全文
posted @ 2013-10-21 09:34 豆沙包没有肉 阅读(252) 评论(0) 推荐(0) 编辑

2013年10月15日

摘要: 推荐使用堆排序,复杂度0(n*lgn)/// /// 利用堆排序选出数组的最小的k个元素 /// public class HeapSort { /// /// 大根堆排序 /// public static void Sort() { int[] array = { 1, 3, 7, 5, 2, 8, 4, 6, 10, 9 }; //创建大根堆,父节点都大于子节点 CreateHeap(array); ... 阅读全文
posted @ 2013-10-15 17:48 豆沙包没有肉 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 方案一:遍历所有子数组,复杂度o(n^3) public static int Max1() { int[] array = { 1, -2, 3, 10, -4, 7, 2, -5 }; int length = array.Length; int maximum = array[0]; int sum = 0; for (int i = 0; i maximum) maximum = sum; ... 阅读全文
posted @ 2013-10-15 16:10 豆沙包没有肉 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 两个字符串中字符是否包含的问题比如,如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPO答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPZ 答案是false,因为第二个字符串里的Z字母不在第一个字符串里。方案一:两个循环分别轮询,复杂度o(m*n)方案二:用快排法对两个字符串进行排序,然后遍历两个已排序的字符串,复杂度o(mlgm)+o(nlgn)+o(m+n) 遍历已经排序字符串的代码 public s... 阅读全文
posted @ 2013-10-15 14:54 豆沙包没有肉 阅读(203) 评论(0) 推荐(0) 编辑

2013年10月10日

摘要: 代码1:访问者//状态 abstract class Action { //得到男人结论或反应 public abstract void GetManConclusion(Man concreteElementA); //得到女人结论或反应 public abstract void GetWomanConclusion(Woman concreteElementB); } //成功 class Success : Action { public override void GetManCo... 阅读全文
posted @ 2013-10-10 17:55 豆沙包没有肉 阅读(201) 评论(0) 推荐(0) 编辑
摘要: Interpreter模式,即解释器模式。解释器模式属于行为模式,Gof是这样定义的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。实例应用:正则表达式代码1:需要解释的表达式//表达式 abstract class Expression { //解释器 public void Interpret(PlayContext... 阅读全文
posted @ 2013-10-10 17:36 豆沙包没有肉 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。代码1:享元,可以复用的对象 //网站 abstract class WebSite { public abstract void Use(User user); } //具体的网站 class ConcreteWebSite : WebSit... 阅读全文
posted @ 2013-10-10 17:13 豆沙包没有肉 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 通过定义我们可以看出中介者主要是通过中介对象来封装对象之间的关系,使之各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。同时通过引用中介者对象来减少系统对象之间关系,提高了对象的可复用和系统的可扩展性。 但是就是因为中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大,所承担的责任也比较多。它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。所以它比较容易应用也很容易误用。故当系统中出现了“ 阅读全文
posted @ 2013-10-10 16:44 豆沙包没有肉 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 职责链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 代码1:处理对 阅读全文
posted @ 2013-10-10 16:15 豆沙包没有肉 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开,实现二者之间的松耦合。代码1:命令接收者 //烤肉串者 public class Barbecuer { public void BakeMutton() { Console.WriteLine("烤羊肉串!"); } public void BakeChickenWing() { ... 阅读全文
posted @ 2013-10-10 16:00 豆沙包没有肉 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。代码1:抽象部分,将实现部分剥离后的部分/ public abstract class AbstractRoad { protected AbstractCar car; public AbstractCar Car { set { car = valu... 阅读全文
posted @ 2013-10-10 14:52 豆沙包没有肉 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1194):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”.NET中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管 阅读全文
posted @ 2013-10-10 11:50 豆沙包没有肉 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。[GOF《设计模式》]在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。代码1:迭代器public interface II 阅读全文
posted @ 2013-10-10 11:33 豆沙包没有肉 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。代码1:叶子节点//人力资源部 class HRDepartment : Company { public HRDepartment(string name) : base(name) { } public override void Add(Company c) { } public override v... 阅读全文
posted @ 2013-10-10 11:15 豆沙包没有肉 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。代码1:备忘需求的发起者 class GameRole { //生命力 private int vit; public int Vitality { get { return vit; } ... 阅读全文
posted @ 2013-10-10 10:41 豆沙包没有肉 阅读(186) 评论(0) 推荐(0) 编辑

2013年10月9日

摘要: 适配器模式(Adapter),其含义是将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作了。因此适配器的主要作用就是完成旧接口到新接口的转换;将“既有系统“进行封装,逻辑上客户程序应该不知道”既有系统“的存在,将变化隔离在适配器部分;如果客户程序需要迁移,仅需要在适配器部分进行修改。其适用性:你想使用一个已经存在的类,而它的接口不符合你的要求,你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可以不一定兼容的类)协同工作,你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象 阅读全文
posted @ 2013-10-09 18:02 豆沙包没有肉 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 状态模式(State),其含义是允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。书中的例子是Tcp连接的状态,处于Established,Listening,Closed等,当一个连接对象收到其他对象的请求时,根据自身的当前状态做出不用的反应。又或者一个人在心情不同的时候对待同一件事会有不同的做法。以状态为原子来改变它的行为,而不是通过行为来改变状态呢?于是你就学到了状态模式。其适用性:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为,一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常有多 阅读全文
posted @ 2013-10-09 15:29 豆沙包没有肉 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。适用场景:观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。代码1:主题,当 阅读全文
posted @ 2013-10-09 14:46 豆沙包没有肉 阅读(195) 评论(0) 推荐(0) 编辑

导航