java 算法基础
时间:2014-05-07 05:48:04
收藏:0
阅读:518
1、算法概要
算法是用于计算、数据处理和自动推理使用的。算法主要是做精确计算和表示一个有限长列的有效方法。算法一般包含清晰定义的指令用于计算函数。基本上也属于一种思考最简洁的方式。
2、算法特征
算法主要包含五个特征
2.1、有穷性;
是指算法必须能在执行有限个步骤后终止;
2.2、确切性;
算法的每一个步骤必须有确切的定义;
2.3、输入项;
一个算法输入有0或多个输入,以刻画预算对象的初始情况,所谓0就是初始化条件;
2.4、输出项;
反馈对数据加工后的结果。没有输出的算法无意义。
2.5、可行性;
算法中执行的任何计算都可以分步骤进行,每个步骤并在有限时间内完成。
3、算法常用的设计模式
主要有十个设计模式
3.1、完全遍历法
在验证一个问题集合时,且以验证正确性和最优性的时候,就会采用完全遍历法。但在便利的过程中就会消耗大量的内存。
3.2、不完全遍历法
当便利时占用的内存空间特别庞大时,可以使用不完全遍历法来实现。例如各种规则算法和搜索算法即是。
3.3、分治法
把一个问题分区成互相独立的部分,分别求解。分治法的好处在于可以并行计算。
分治法所能解决的问题一般具有以下几个特征:
(1) 该问题的规模缩小到一定的程度就可以容易地解决;
(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3) 利用该问题分解出的子问题的解可以合并为该问题的解;
(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
3.4、动态规划法
当问题整体的最优解是由局部最优解组成的时候,会经常采用这种规划方法。用于求解包含重叠子问题的最优化问题的方法。
3.5、贪婪算法(也叫贪心算法)
常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。
3.6、线性规则法
问题是目标函数和约束条件都是线性的最优化
3.7、简并法
把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。
3.8、穷举法
穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译。
3.9、分枝界限法
分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索
3.10、回溯法
运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。
6、复杂度
6.1、时间复杂度
时间复杂度是指着算法需要消耗的时间资源。一般来说,计算机算法说问题模型n的函数f(n),算法的时间复杂度因因此被记做
T(N)=O(F(N))
算法执行时间的增长率与f(n) 的增长率正相关,称作渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。
常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
6.2、空间复杂度
算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
6.3、非确定性多项式时间复杂度(np)
非定常多项式(英语:non-deterministic polynomial,缩写NP)时间复杂性类,或称非确定性多项式时间复杂性类,包含了可以在多项式时间内,对一个判定性算法问题的实例,一个给定的解是否正确的算法问题。
6.4、复杂度特性
所有算法都需要符合这三种特性正确性、可读性以及健壮性。
7、算法分类
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
算法可以宏泛的分为三类:
一,有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。
二,有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。
三,无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。
8、几个算法基础小实践
8.2、求最大公约数
8.4、猴子吃桃子
8.5、乒乓球比赛
8.6、数列求和
8.7、2的问题
8.8、自由落体球
8.9、累乘
8.10、递归求5!
9、资料分享
1、算法笔记(可以看看里面有很多比较有意思的算法) http://www.csie.ntnu.edu.tw/~u91029/
2、20世纪十大算法http://www.uta.edu/faculty/rcli/TopTen/topten.pdf
3、维基算法百科:http://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95
4、百度算法百科:http://baike.baidu.com/link?url=5sSYcikkqGncq7qdeF3JkMKxbyFBZOLjmjqFQUP51NNhZ3zBj_xtrdMiFnkWlREX
5、麻省理工大学算法公开课:http://v.163.com/special/opencourse/algorithms.html
6、算法博客:http://www.iteye.com/blogs/tag/%E7%AE%97%E6%B3%95
7、十三个经典算法研究与总结 http://blog.csdn.net/v_JULY_v/article/details/6305212
算法是用于计算、数据处理和自动推理使用的。算法主要是做精确计算和表示一个有限长列的有效方法。算法一般包含清晰定义的指令用于计算函数。基本上也属于一种思考最简洁的方式。
2、算法特征
算法主要包含五个特征
2.1、有穷性;
是指算法必须能在执行有限个步骤后终止;
2.2、确切性;
算法的每一个步骤必须有确切的定义;
2.3、输入项;
一个算法输入有0或多个输入,以刻画预算对象的初始情况,所谓0就是初始化条件;
2.4、输出项;
反馈对数据加工后的结果。没有输出的算法无意义。
2.5、可行性;
算法中执行的任何计算都可以分步骤进行,每个步骤并在有限时间内完成。
3、算法常用的设计模式
主要有十个设计模式
3.1、完全遍历法
在验证一个问题集合时,且以验证正确性和最优性的时候,就会采用完全遍历法。但在便利的过程中就会消耗大量的内存。
3.2、不完全遍历法
当便利时占用的内存空间特别庞大时,可以使用不完全遍历法来实现。例如各种规则算法和搜索算法即是。
3.3、分治法
把一个问题分区成互相独立的部分,分别求解。分治法的好处在于可以并行计算。
分治法所能解决的问题一般具有以下几个特征:
(1) 该问题的规模缩小到一定的程度就可以容易地解决;
(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3) 利用该问题分解出的子问题的解可以合并为该问题的解;
(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
3.4、动态规划法
当问题整体的最优解是由局部最优解组成的时候,会经常采用这种规划方法。用于求解包含重叠子问题的最优化问题的方法。
3.5、贪婪算法(也叫贪心算法)
常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。
3.6、线性规则法
问题是目标函数和约束条件都是线性的最优化
3.7、简并法
把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。
3.8、穷举法
穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译。
3.9、分枝界限法
分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索
3.10、回溯法
运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。
6、复杂度
6.1、时间复杂度
时间复杂度是指着算法需要消耗的时间资源。一般来说,计算机算法说问题模型n的函数f(n),算法的时间复杂度因因此被记做
T(N)=O(F(N))
算法执行时间的增长率与f(n) 的增长率正相关,称作渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。
常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
6.2、空间复杂度
算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
6.3、非确定性多项式时间复杂度(np)
非定常多项式(英语:non-deterministic polynomial,缩写NP)时间复杂性类,或称非确定性多项式时间复杂性类,包含了可以在多项式时间内,对一个判定性算法问题的实例,一个给定的解是否正确的算法问题。
6.4、复杂度特性
所有算法都需要符合这三种特性正确性、可读性以及健壮性。
7、算法分类
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
算法可以宏泛的分为三类:
一,有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。
二,有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。
三,无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。
8、几个算法基础小实践
8.1、求最大值算法
package study.arithmetic; /** *求最大数值 *我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”: *首先将第一颗豆子放入口袋中。 *从第二颗豆子开始检查,如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。反之则继续下一颗豆子。直到最后一颗豆子。 *最后口袋中的豆子就是所有的豆子中最大的一颗。 */ public class Max { public static int max(int array[]){ int mval = array[0]; for (int i = 0; i < array.length; i++){ if (array[i] > mval){ mval = array[i]; } } return mval; } }
8.2、求最大公约数
package study.arithmetic; public class Gcb { private static int gcb(int a,int b){ if(a%b==0){ return gcb(b,a%b); } return b; } public static void main(String args[]){ System.out.println(gcb(110,99)); } }8.3、兔子问题
package study.arithmetic; /** * 题目:古典问题 * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? * 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... * @author TianYou */ public class CalculateRabbit { private static long calculateRabbit(int month){ long rabbitOne = 1L; long rabbitTwo = 1L; long rabbit; for(int i=3; i<month; i++) { rabbit = rabbitTwo; rabbitTwo = rabbitOne + rabbitTwo; rabbitOne = rabbit; } return rabbitTwo; } public static void main(String args[]){ System.out.println(calculateRabbit(20)); } }
8.4、猴子吃桃子
package study.arithmetic; /** * 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾, * 又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 * 以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 * 求第一天共摘了多少。 * @author TianYou */ public class Monkey { private static int MonkeyPeach(int size){ int lastdayNum = 1; for(int i=2; i<=size; i++) { lastdayNum = (lastdayNum+1) * 2; } return lastdayNum; } public static void main(String args[]){ System.out.println(MonkeyPeach(100)); } }
8.5、乒乓球比赛
package study.arithmetic; /*** * 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 * 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 * @author TianYou */ public class EighteenthPingpang { private static void pingpang(char[] m,char[] n){ for (int i = 0; i < m.length; i++) { for (int j = 0; j < n.length; j++) { if (m[i] == ‘a‘ && n[j] == ‘x‘) { continue; } else if (m[i] == ‘a‘ && n[j] == ‘y‘) { continue; } else if ((m[i] == ‘c‘ && n[j] == ‘x‘) || (m[i] == ‘c‘ && n[j] == ‘z‘)) { continue; } else if ((m[i] == ‘b‘ && n[j] == ‘z‘) || (m[i] == ‘b‘ && n[j] == ‘y‘)) { continue; } else { System.out.println(m[i] + " vs " + n[j]); } } } } public static void main(String[] args) { char[] m = { ‘a‘, ‘b‘, ‘c‘ }; char[] n = { ‘x‘, ‘y‘, ‘z‘ }; pingpang(m,n); } }
8.6、数列求和
package study.arithmetic; import java.text.DecimalFormat; /** * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和 * @author TianYou * */ public class TwentiethFractionSum { private static void count(){ int x = 2, y = 1, t; double sum = 0; DecimalFormat df = new DecimalFormat("#0.0000"); for(int i=1; i<=20; i++) { sum += (double)x / y; t = y; y = x; x = y + t; System.out.println("第 " + i + " 次相加,和是 " + df.format(sum)); } } public static void main(String args[]){ count(); } }
8.7、2的问题
package study.arithmetic; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 * 关键是计算出每一项的值 * @author TianYou */ public class Sumloop { public static void main(String args[]) { count(5d); } private static void count(double input) { double s = 0; double output = 0; for(double i =1;i<=input;i++) { output += input; double a = output; s+=a; } System.out.println(s); } }
8.8、自由落体球
package study.arithmetic; /** * 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? * @author TianYou * */ public class Ex10 { public static void count(){ double s=0; double t=100; for(int i=1;i<=10;i++){ s+=t; t=t/2; } System.out.println(s); System.out.println(t); } public static void main(String args[]){ count(); } }
8.9、累乘
package study.arithmetic; /** * 题目:求1+2!+3!+...+20!的和 * @author TianYou */ public class Ex21 { public static void count(){ long sum = 0; long fac = 1; for(int i=1; i<=10; i++) { fac = fac * i; sum += fac; } System.out.println(sum); } public static void main(String args[]){ count(); } }
8.10、递归求5!
package study.arithmetic; /** * 递归公式:fn=fn_1*4! * @author TianYou * */ public class Ex22 { public static void main(String args[]){ recursion(5); } public static long recursion(int n) { long value = 0 ; if(n ==1 || n == 0) { value = 1; } else if(n > 1) { value = n * recursion(n-1); } return value; } }
9、资料分享
1、算法笔记(可以看看里面有很多比较有意思的算法) http://www.csie.ntnu.edu.tw/~u91029/
2、20世纪十大算法http://www.uta.edu/faculty/rcli/TopTen/topten.pdf
3、维基算法百科:http://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95
4、百度算法百科:http://baike.baidu.com/link?url=5sSYcikkqGncq7qdeF3JkMKxbyFBZOLjmjqFQUP51NNhZ3zBj_xtrdMiFnkWlREX
5、麻省理工大学算法公开课:http://v.163.com/special/opencourse/algorithms.html
6、算法博客:http://www.iteye.com/blogs/tag/%E7%AE%97%E6%B3%95
7、十三个经典算法研究与总结 http://blog.csdn.net/v_JULY_v/article/details/6305212
评论(0)