zoukankan      html  css  js  c++  java
  • 初识算法之定义/斐波那契数列/时间复杂度

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

    如何去衡量不同算法之间的优劣势呢?
    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),常数阶;
    
    
    时间复杂度越大,执行效率就越低
    人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
  • 相关阅读:
    PTA 5-3 树的同构 ——理解递归
    停车管理系统
    两个有序链表序列的合并 (15分)
    lua 面向对象笔记 继承 和 组合
    二叉树高度计算,判定是否为平衡二叉树
    会用git的重要性,记工作中使用git reset 代码丢失的教训
    #include <bits/stdc++.h> 万能头文件
    C++中类的静态变量成员
    C++创建对象加括号和不加括号的区别
    deepin(深度系统)安装微信 qq
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/14627719.html
Copyright © 2011-2022 走看看