初识算法之定义/斐波那契数列/时间复杂度

算法是指用来操作数据,解决程序问题的一组方法。

如何去衡量不同算法之间的优劣势呢?
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),常数阶;


时间复杂度越大,执行效率就越低

 

posted @ 2021-04-07 14:57  ProZkb  阅读(245)  评论(0编辑  收藏  举报