摘要:
1.概述将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,这就是建造者模式。简单的说就是生产一个产品的步骤比较稳定,单个步骤变化会产生一个不同的产品。2.实践物理模型建造者模式的例子很多,如肯德基套餐,游戏角色人物等等。前一段时间同事辞职去开了一家米线店,开张时我们这些同事都去捧... 阅读全文
摘要:
概述在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象。抽象工厂模式可以提供一种封装机制来面对这种需求。实践物理模型:皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如Input的样式,button的样式,这些所有的元... 阅读全文
摘要:
1.引用上一节【WCF之旅】第一回:概述中对WCF进行简单的介绍了一下,WCF是一个框架,里面的东西很多,本节会介绍创建一个服务的基本要素。2.服务2.1术语这里只介绍一些跟创建服务协定相关的术语消息:消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。服务:服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。终结点:终结点是用来发送或接收消息(或执行这两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)— 该定 阅读全文
摘要:
1.引言最近在学习wcf,是在跟着徐长龙老师的讲的《跟我一起从零开始学WCF》课件进行学习的,由于发现学了几节后,由于各种原因,暂停学习了,很快就会忘记,决定跟着教程学习时,把它记录下来,以加深映像。2.WCF概述2.1 需求一家汽车租赁公司决定创建一个新的应用程序,用于汽车预定,该租车预定应用程序的创建者知道,应用程序所实现的业务逻辑必须能够让公司内外运行的其他软件访问,其它软件如下:运行在Windows 桌面上的呼叫中心客户端应用程序;基于 J2EE 服务器构建;在非 Windows 系统上运行的现有预定应用程序;运行在各种平台上的合作伙伴应用程序,每个应用程序分别位于一个与该汽车租赁公司 阅读全文
摘要:
1.概述基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序的时间复杂度是 O(k·n),其中n是排序元素个数 阅读全文
摘要:
1.概述桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响,速度是比较快的。步骤:设置一个定量的阵列当作空桶子。寻访序列,并且把项目一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把项目再放回原来的序列中。理解:例如待排数字 [6 2 4 1 5 9],准备10个空桶,最大数个空 阅读全文
摘要:
1.概述堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。原理:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点,将 它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。,如此反复执行,便能得到一个有序序列了,堆排序的时间复杂度为O(nlogn)。1.1 什么是堆这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组 阅读全文
摘要:
1.概述原理:把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组,因此空间复杂度为O(n)。归并操作的过程如下:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针达到序列尾将另一序列剩下的所有元素直接复制到合并序列尾理解:递归便是深度遍历(如下由左至右进行遍历),假设有这样的一列数组{9,8,7,6,5,4,3,2,1}进行划分的顺序如下:{9,8,7, 阅读全文
摘要:
1.概述原理:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止,时间复杂度为O(n2)。就好像是水里的东西,重量轻的会浮在上面,重点的是下面一层,最重的在最下层。2.示例 //冒泡排序 public static void BubbleSort(int[] nums) { int temp; for (int i = 0; i < nums.Length - 1; i++) { for (int j = nums.Length - 1; j ... 阅读全文
摘要:
1.概述希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。原理:先将序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。插入排序在元素基本有序的情况下,效率会更高,因此先分组,再插入排序,再组装,已达到序列基本有序,所以希尔排序在时间效率上比插入排序有较大提高,时间复杂度为O(n3/2)。2.示例 //希尔排序 public static void ShellSort(int[] num... 阅读全文
摘要:
1.概述原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序,杂度为O(n2)。步骤:遍历从第二个元素开始,比较前面的元素是否大于该元素,大于的话,交换位置。依此类推。理解:手上有一副牌,要按照从小到大的顺序排序,先把第2张跟第一张进行比较,如果第一张大于第二张就调用。再拿第3张牌跟前面两张进行比较,先比较第二张,如果大于换位置,再比较第一张。再拿第4张牌跟前面3张从右往左进行比较,其它牌依此类推。2.示例 //插入排序 public static void InsertionSor... 阅读全文
摘要:
1.概述原理:从序列中,每次把最小的一个元素放在左边,依次类推,已达到排序,查找最小的元素需要一个遍历过程,而排序也要一个遍历过程,这个算法的时间复杂度也是O(n*n)。步骤:遍历找出最小的一个元素,插入最左边;最小元素插入到左边,再查找剩余元素中最小元素,再次插入到该元素的最左边,依次类推。2.示例 //选择排序 public static void SelectionSort(int[] nums) { for (int i = 0; i < nums.Length - 1; i++) { ... 阅读全文
摘要:
1.概述快速排序(Quick sort) 原理:选取一个基数,通过一次扫描将要排序的数据分割成两部分,其中一部分所有数据都比这个基数小,另外一部分所有数据都不小于这个基数,然后按照此方法进行递归,已达到排序。方法步骤:设定要排序的起始和结束位置选一个基数,一般直接选这个起始和结束坐标的中间坐标已这个基数为准,循环遍历集合,从起始坐标开始,把大于基数的放在基数的右边,从结束坐标开始查找,把小于基数的放在基数的左边。一次排序后,左边的数据都小于基数,右边的都大于基数,再重新开始上面的步骤1,2,32.示例 public static void QuickSort(int[] nums... 阅读全文
摘要:
1.引言在软件系统 中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供 一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。 2.实战结构图:意图:定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 class Program { static void Main(string[] args) { ... 阅读全文
摘要:
1.引言设计模式的文章,园子里很多,本人也只是在看文章,把自己的理解写下来,已加深映像。Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这也是一种功能的实现,比如缓存Cache,虽说有很多访问点,但是它们其实都访问的是同一个实例。Singleton模式是用于控制创建对象,所以是一种创建型模式。2.实战物理模型:实现实例唯一,很快就想到了静态变量。static变量,如果类中没有静态构造函数,该变量将在编译时就被添加到加载堆loader heap中,如果有静态构造函数,将在第一次访问类时进行初始化,初始化完成之后,就一直在loader heap中,将不会消失,是分配的 阅读全文