数据结构(三)算法的基本概念
一、算法问题的规模
所谓算法问题的规模,实际上就是对算法处理问题大小的一种抽象,我们一般习惯使用n、m等字符表示一个问题的规模。举一个比较实际的例子:例如一个排序算法是针对数组进行排序的,那么这个数组中的元素数量就可以认为是这个排序问题的规模;再比如说:使用二分搜索算法在一个ArrayList集合中查询一个指定元素的下标,那么这个集合的长度就可以看做是这个二分搜索问题的规模。所以:算法的规模实际上就是这个算法解决的问题中,保存数据多少的一种描述。
二、算法的时间复杂度和空间复杂度
我们都知道不同的算法适用于不同的场景,算法之间本身没有好与坏的区别,有的只是在处理相同规模问题的时候,谁快谁慢哪一种算法占用辅助空间更少的区别。
算法的时间复杂度和空间复杂度是用来衡量一个算法快慢与否以及运行时占用辅助空间大小的一种计算标准,一般用O()表示。算法的时间复杂度是不能精确计算的,所有算法的时间复杂度只不过是对算法运行时间和处理问题规模之间关系的一种估算描述。
1.时间复杂度
时间复杂度是用来大致描述算法运行时间和算法处理问题规模之间关系的一种衡量标准,一个算法的时间复杂度越高,那么也说明这个算法在处理问题的时候所花费的时间也就越长,但是正如前面我们说过的,一个算法的时间复杂程度并不能被精确计算出来,我们计算算法时间复杂程度,也只不过是粗略的估算。那么,在一个算法的运算过程用时公式被计算出来之后,我们遵从如下“忽略”标准描述其时间复杂度:
1.忽略公式中的常数项
2.忽略公式中的低次幂项,仅保留公式中的最高次幂项
3.忽略公式中最高次幂项的系数
4.如果一个公式中所有的项都是常数项,那么这个算法的时间复杂度统一表示为O(1)
下面我们来举几个相关的案例进行说明:
例1:算法1的运算过程用时公式是:2n^2 + 5n + 6,则这个算法的时间复杂度是O(n^2)
例2:算法2的运算过程用时公式是:nlogn + 5n + 2,则这个算法的时间复杂度是O(nlogn)
例3:算法3的运算过程用时公式是:2n + 7,则这个算法的时间复杂度是O(n)
例4:元素交换算法只有3个步骤,其运算过程用时公式为:1+1+1,则其时间复杂度是O(1)
在排序算法中,常见的时间复杂度有3种,分别是:O(n^2 )、O(nlogn)、O(n)
其中logn表示以2为底n的对数,这个值到底是怎么计算出来的,在快速排序算法中我们会详细进行分析上述的3种时间复杂度之间的大小关系是:O(n 2 ) > O(nlogn) > O(n)
2.空间复杂度
空间复杂度是用来衡量一个算法在运行过程当中,在除了保存原始数据的空间之外,还需要额外消耗多少空间的一种衡量标准。举个例子:冒泡排序在执行过程中,只需要消耗一个临时变量,用来交换两个反序的元素即可,所以冒泡排序的空间复杂度就是O(1)。空间复杂度和时间复杂度一样,也是用来描述算法问题规模和运算时消耗额外空间之间关系的一种表达式,并不是用来详细计算数值的公式。排序算法中空间复杂度常见的也是有3种:O(1)、O(n)、O(logn)。而空间复杂度和时间复杂度相似的是,空间复杂度越高,就表示这个算法在运行过程中所需要消耗的额外空间也就越多从这个角度来讲,上面的三种空间复杂度之间的关系可以看做:O(logn) > O(n) > O(1)
3.排序算法的稳定性
排序算法的稳定性指的是,在一个排序算法处理的数组或者集合中,如果存在取值相同的元素,那么在排序完成前后,这些取值相同的元素之间的相对顺序有没有发生变化,如果排序之后,取值相同元素之间的相对顺序没有发生变化,那么这个排序算法就是稳定的,如果排序之后,取值相同元素之间的相对顺序发生了变化,那么这个排序算法就是不稳定的。
4.8种排序算法的相关概念取值: