(基于Java)算法之动态规划——矩阵连乘问题
摘要:动态规划(Dynamic Programming):与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适用于动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。 使用动态规划法求解的问题需要符合一些条件:(1):所求解问题必须要符合最优子结构;(最优子结构即:原问题的最优解中包含了子问题的最优解)(2):原问题分解出来的子问题相互之间存在联系,即递归时会重复解决之前已解决过的子问题。 先说明一些前提:(1):矩阵相乘的条件是:前一个矩阵的行数=后一个矩阵的列数;(2):可以用数组p[0:n]来存放n个连乘..
阅读全文
算法之线性时间选择(最坏情况下)
摘要:线性时间选择(Linear Select):这个名字不太好理解,什么叫线性时间选择?一句话,在线性时间内完成选择。一般情况下是这样的,我们想要找出一个数组中的最大值或最小值,那就只需要一次排列,然后输出第一个或最后一个元素就行了,但如果是要找出一个数组中的第k小的元素呢? 在一般情况下,可以用RandomizedSelect方法来找出第k小的元素,平均时间是O(n),但在最坏情况下,所用的时间则是n^2,因此,本文讨论的就是在最坏情况下,如何在O(n)时间内完成选择。算法的思路总体有些复杂,但每一步其实不难,下面即给大家介绍最坏情况下的线性时间选择算法。(1):将n个输入元素以每组5个地划分.
阅读全文
算法之快速排序
摘要:快速排序(Quick Sort):快速排序算法是基于分治策略的另一个排序算法。其基本思想是,对于输入的子数组a[p:r],按以下三个步骤进行排序: (1)分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q],和a[q+1:r],使a[p:q-1]中任何一个元素都小于等于a[q],而a[q+1:r]中任何一个元素都大于等于a[q]。下标q在划分过程中确定。 (2)递归求解(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。 (3)合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,...
阅读全文
算法之合并排序
摘要:合并排序(MergeSort):又叫归并排序,该算法是用分治策略实现对N个元素进行排序的算法。时间复杂度为O(nlogn)。合并排序的基本思想是:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合,如图:合并排序的方法可以用递归来实现,代码如下: 1 private static int[] mergeSort(int[] num,int[] num1,int l,int r){ 2 int mid; 3 int[] num2 = new int[r + 1]; 4 if(l == r) 5 ...
阅读全文
算法之二分搜索法
摘要:二分搜索法(Binary Search)是一种常用的搜索算法,比起冒泡排序和选择排序来说,二分搜索法的时间效率要更高,为O(logn)。算法思路:在给出的数组按从小到大排好序的情况下,先把目标值与中间值比较,若相等,直接返回中间值下标;若目标值小于中间值,则说明目标值在数组的前半段;若目标值大于中间值,则说明目标值在数组的后半段;然后运用递归,直至搜索出目标值的位置或搜索整个数组都找不到目标值时才停止。下面我直接给出二分搜索法的代码: 1 class BinarySearch 2 { 3 public static int binarySearch(int num, int l, i...
阅读全文
设计模式之装饰者模式
摘要:装饰者模式(Decorator Pattern):装饰者模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个装饰对象,来包裹真实的对象,即被装饰对象。 稍微百度一下,看到都是乱七八糟的文章。。这里,我用举例子的方法来给介绍装饰者模式。 从实际出发,把生活中的例子活用到代码中能更好地理解。比如说,工人有很多种,水管工、木匠之类的,不同的职业也有分不同的公司的,A公司、B公司等等。下面我弄了一个图来说明工人、具体工种、不同工种在不同公司之间的关系: 同时,也抛出了一个疑问,这些层次关系要怎么表示,该用继承吗?当然可以用继承,但是有一个问题,假如还有很多别...
阅读全文
设计模式之工厂设计模式(二:抽象工厂模式)
摘要:工厂模式:用来实例化有共同接口的类,应用工厂模式可以动态决定实例化哪一个类工厂模式的分类:1、简单工厂模式(Simple Factory)2、工厂方法模式(Factory Method)3、抽象工厂模式(AbstructFactory)(本文只介绍抽象工厂模式,想了解简单工厂模式与工厂方法模式请到http://www.cnblogs.com/Not-Famous/p/3648535.html)另外,本文转自http://blog.csdn.net/liruikqn/article/details/12888511,本人根据个人理解,稍有删改。 抽象工厂模式(Abstract Factory).
阅读全文
设计模式之工厂设计模式(一:简单工厂模式与工厂方法模式)
摘要:工厂模式:用来实例化有共同接口的类,应用工厂模式可以动态决定实例化哪一个类工厂模式的分类:1、简单工厂模式(Simple Factory)2、工厂方法模式(Factory Method)*3、抽象工厂模式(AbstructFactory)(本文先介绍总结简单工厂模式和工厂方法模式,抽象工厂模式比较复杂。。等我弄懂了再另开一篇文章来介绍总结)1、简单工厂模式(Simple Factory): 又叫静态工厂,主要是一个静态方法,通过if语句来动态实现需要实现的类。我们通过产品A,产品B的例子来说明:1.首先为所有的产品定义一个共同的产品接口1 public interface Product{}.
阅读全文