一,算法是什么?
算法就是计算或解决问题的步骤,例如:菜谱, 是一种对按步骤解决问题的实现方式的描述,不同的是算法是严密的,而且算法的步骤都是用数据方式来描述,十分的明确。
二,如何选择算法
最重要的是算法的运行时间,即从输入数据到输出结果这个过程所花费的时间。当然计算器内存的大小也是考量之一。
三,初识算法
1,实现一个有50个不同数字组成的数列中从小到大排列
1),全排列算法
全排列算法的一个重要思路,就是将数列中的元素的排列,与某种顺序建立一一映射的关系,按照这种顺序,将集合的所有排列全部输出。这种顺序需要保证,既可以输出全部的排列,又不能重复输出某种排列,或者循环输出一部分排列。
假设数列为 :321
321, 312,231, 213, 132, 123 6种方式
如果是:12345 那么将有 120
1。。。10 那么将有 3628800
。
。
1。。。50 大概有10^40种
2),实现思路
① 生成一个由n个数字构成的数列(不和前面生成的数列重复);
②如果①中生成的数列按从小到大的顺序排列就将其输出,否则回到步骤①。.
3),引入阶乘概念
运气好一次就行,假设运气不好,最后一次实现,n个数字就有n!中不同的排列方式(n! = 1*2*3...(n-2)(n-1)n)。
n! = 1*2*3...(n-2)(n-1)n
阶乘:自然数n的阶乘写作n!。
一个正整数的阶乘是所有小于及等于该数的正整数的积,并且有0的阶乘为1。
2,那么我们换一种方式,选择排序算法
1)选择排序算法
选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
2)实现思路
①从数列种寻找最小值
②将最小值和数列的最左边的数字进行交换,排序结束。回到①
首先,为了在第一轮找到最小的数字,需要从左往右确认数列数字,只要查询n个数字即可。在接下;来的第2轮中,需要从n-个数字中寻找最小值,所以这个步骤进行到第n轮的时候,需要查询的次数如下。
n+(n-1)+(n-2)+...3+2+1=n(n+1)/2 <= n^2
n=50的时候 ,最多2500。假设一个数需要一秒,那显然选择排序比全排列算法效率要高的多。
四,计算运行时间的方法
单单考虑不同算法在运行时间上的区别,还要了解根据数据量的大小,算法的运行时间具体会产生多大的变化。
如果是一个两位数的数列呢?那显然全排列算法的2步要比选择排序算法的3步更省时间。
1,如何求得运行时间
如果我们使用“步数”来描述运行时间,“1步”就是计算的基本单位。通过计算“计算从开始到结束总共执行了多少步”来算出运行时间。
①从数列种寻找最小值
②将最小值和数列的最左边的数字进行交换,排序结束。回到①
如果数列种有n个数字,那么①种“寻找最小值”的不走只需要确认n个数字即可,将“确认1个数字的大小”作为操作的基本单位,需要的时间设为T1 ,那么步骤①的运行时间就是 : n * T1
接下来,把“对连个数字进行交换”也作为操作的基本单位,需要的时间设为T2。那么①和②总共重复n次,每经过“1轮”,需要查找的数字就减少1个,因此总的运行时间如下
(n*T1 + T2)+( (n-1)*T1 +T2)+...(2*T1 +T2)+(T1+T2)
= 1/2 T!n(n+1) + T2n
= 1/2 T1*n^2 + (1/2T1 +T2)n
我们已经得到了运行时间,但这个结果并不直观,还可以简化。T1,T2都是基本单位,与输入无关。会根据输入变化而变化的只有数列的长度n,所以接下来考虑n变大的情况。n越大,n^2也就越大,其他部分相对变小.所以说对结果影响最大的是n^2
1/2 T1*n^2 + (1/2T1 +T2)n = O(n^2)
o 这个符号表示忽略重要项目以外的内容,O(n^2)的含义就是:算法的运行时间最长也就是n^2的常数倍。
比如,当我们知道选择排序的时间复杂度为O(n^2),快速排序的时间复杂度为O(nlogn)时,很快就能判断出快速排序的运算更为告诉,二者的运行时间根基输入的n产生的变化程度也一目了然。
快速排序的时间复杂度