算法的概念
算法,具体说来就是有穷规则的集合,规则在这里是指对某一个问题进行求解的序列。我在上一篇博客说到算法是数据结构的配偶,的确,我们可以这样认为。因为判定一个算法好不好,也要看它的数据结构,如果数据结构选得不好,那么这个算法效率就不高。有一个著名的公式是:数据结构+算法=程序。可见这三者之间的关系。而程序也就是算法的实现,是算法的最终解,软件解。
算法有五大特征:
有穷性:
一个算法在执行有限的步骤之后必须结束。理解起来就是有始有终。
确定性
当算法执行完得出的结果必须是确定的,无歧义性。每一个步骤也应该是确切定义的。
可行性
算法中的所有运算都必须精确的实现,
输入性
可以有零个或多个输入。
输出性
至少要有一个输出结果,如果没有输出的话,那么程序就相当于没有执行一样,因为最终结果都没有。
算法的描述
我们知道算法是为了求解问题,最终要用程序来实现。但是用程序来实现那是一种程序的描述形式,不便于人们去互相交流算法,去浏览算法的实现过程。那到底有什么更好的利于人们互相交流、浏览算法的描述形式呢?比如自然语言、流程图、伪代码等等都可以用来算法的描述。
自然语言所示
流程图所示
伪代码所示
IF 九点以前 THEN
do 私人事务;
ELSE 9点到18点 THEN
工作;
ELSE
下班;
END IF
算法判定标准
算法也有好的,也有不好的。有效率高的,也有效率不高的,那怎么判定它呢?从两个方面。
第一个方面:正确性
给用户反馈的输出结果一定要正确。这是最起码也是最重要的判定标准。
比如一个排序算法,要求对任意n个数据完成排序。这些数据中有整数,有浮点数,还要字符串。而你只能对整数数据完成排序,或者说你只能完成指定几个数据的排序,再多几个数据就不行了。那么很明显,这个算法就不达标。
另一个方面:有效性
谈到有效性,那就是程序执行时间越短越好,内存空间越小越好。这里涉及到算法的时间复杂度和空间复杂度,有效性主要看这两个指标。
时间复杂度
时间复杂度通常表示算法执行的时间单位,是输入数据量n的函数,用T(n)来表示,描述算法执行过程中所需的时间用量与问题规模n之间的函数关系。比如排序10000个数肯定比排序10个数执行时间长一点。执行过程的时间是随排序的数量来进行变化的。
T(n)=执行基本语句的总条数。 每执行一个基本语句相当于一个时间单位。
void show(){
System.out.pringln("Hello,你今天真好看!"); //执行1次
System.out.println("哈哈,谢谢"); //执行1次
}
// f(n) = 1+1 = 2 T(n) = O(1)
T(n) = O(f(n))。
f(n)是运行时间增长率的上界。
大O函数只求T(n)的最高阶,忽略其低阶项和常系数。
这样就简化了T(n)的计算,能很客观很清楚的反映当n很大时,算法的时间性能。
void show(int n){
for(int i=0; i<n;i++){ //执行n+1次
System.out.println("Hello,你今天真好看!");//执行n次
System.out.printlm("哈哈,谢谢");//执行n次
}
//f(n)=n+n+n+1=3n+1 T(n) = O(n)
}
常见时间复杂度有:常数阶O(1)、线性阶O(n)、对数阶O( logN)、平方阶O(n²)和 指数阶O(2^n)。通常认为,具有_常数阶_量级的算法是好算法,而具有_指数阶_量级的算法是差算法。
空间复杂度
空间复杂度是算法对存储空间的需求,是算法执行时所需的占用内存数。通常只计算辅助空间用量,不计算原始数据所占的数。用S(n)来定义。
和时间复杂度一样,也是用大O函数表示。
int i = 1; //定义一个变量
int j = 2; //定义一个变量
int z = 3; //定义一个变量
int sum = i+j+z; //定义一个变量
// S(n) = O(1)
int[] nums = new int[n]; //定义n个变量
// S(n) = O(n)
for(int i=0;i<n;i++){ // 定义一个变量
for(int j=0;j<n;j++){ //定义一个变量
int sum = i+j; //定义n^2个变量
System.out.println(sum);
}
}
// S(n) = O(n^2)
下一篇博客请期待
无论是数据结构还是算法,如果我们怀有好奇心具体深入研究它们的话,完全可以它们当作一门科目来系统的进行学习。但我只是临时安排数据结构和算法客串一下,因为我们的最终目标是学会JavaWeb,主角永远是JavaWeb,而它牵扯到很多很多角色,这些角色我们没办法都给它们立传,所以我说的并不详细。只是粗略的介绍一下。但如果我认为某个角色很重要的话,我想是可以立个传的。比如下一个重量级角色——数据库,我想立个传。请期待…