算法是指用来操作数据,解决程序问题的一组方法。
如何去衡量不同算法之间的优劣势呢?
2:事前分析估算
在计算机程序编制前,依据统计方法对算法进行估算。
1:事后统计法(依赖硬件环境和数据规模的影响)
通过统计,监控,利用计算机计时器对不同算法的运行时间进行比较,从而确定算法的效率高低,但是有非常大的局限性。
斐波那契数列:这个数从第三项开始,每一项都等于前两项之和
下标:0 1 2 3 4 5 6 7 8
数列:0 1 1 2 3 5 8 13 21
1:递归实现(自己调用自己,盗梦空间:梦里套梦;俄罗斯套娃) n指代的是下标,索引 public static long fun1(long n) { if(n<=1) return n; return fun1(n-1)+fun1(n-2); } 2:循环实现 public static int fun2(int n) { if(n<=1) return n; int first=0; int second=1; for(int i=0;i<n-1;i++) { int Sum=first+second; first=second; second=sum; } return second; }
相比较而言:循环实现的耗时< 递归实现
通俗来讲就是,一个算法运行起来所消耗的时间称之为时间复杂度
通俗来讲就是,一个算法运行起来要消耗多少内存称之为空间复杂度
引入时间复杂度:O(n) https://www.bilibili.com/video/BV1sX4y1G7oM?p=5&spm_id_from=pageDriver
如何在不运行代码的情况下,用“肉眼”得到一段代码的执行时间呢?
T(n)=O(f(n))
n:是指传入的参数(数据规模的大小)
T(n):表示代码执行的总时间;
f(n):表示每次代码执行的次数总和;
因为这是一个公式,所以用f(n)来表示。公式中的O,表示代码的执行时间T(n)与f(n)表达式成正比
例如:T(n)=O(f(3+3n+3n^2))
3+3n+3n^2 中,n^2是最能影响结果的
大O表示法:当数据规模庞大的时候,会忽略一些小的因素
所以在看到的一些时间复杂度的公式,有可能是已经忽略了小的因素,直接是影响最大的算式因素了。
大O时间复杂度实际上并不具体表示代码真正的执行时间,而是代码代码时间随数据规模增长的变化趋势。所以,也叫作渐进时间复杂度,简称时间复杂度。
分类: T(n)=O(f(n^2))==>O(n^2)==》读作平方阶 T(n)=O(1)==》读作常数阶 T(n)=O(n)==》读作线性阶 T(n)=O(n^2)==》读作平方阶,如果算法是平方阶的话,就要考虑算法的实用性了。 T(n)=O(logn)==》读作对数阶 T(n)=O(nlogn)==》读作线性对数阶
一般for循环涉及到的时间复杂度是O(n)
如果是嵌套循环,时间复杂度就是O(n^2)
Eg: public static void Sum() { int i=1; int j=1; int m=i+j; } 这个算法的时间复杂度是O(1),不是O(3); 所有的常数都是用O(1)来表示,不管你代码中执行多少次,只要不涉及到N,统称为O(1); 算法中没有循环语句的都是O(1),常数阶; 时间复杂度越大,执行效率就越低