首页 > 编程语言 >算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度

时间:2024-01-05 22:31:38浏览次数:28  
标签:int 复杂度 衡量 次数 算法 时间 空间

1.算法效率

1.1如何衡量一个算法的好坏

long long Fib(int N)
{
  if(N<3)
  {
    return 1;
  }
  return Fib(N-1)+Fib(N-2);
}

斐波那契数列的递归实现方式非常简洁,但是简洁一定好吗?那应该如何衡量其好与坏呢?

1.2算法的复杂度

衡量一个算法的好坏,一般是从时间和空间上来衡量的,即时间复杂度和空间复杂度

时间复杂度:主要是衡量一个算法运行速度的快慢

空间复杂度:主要是衡量一个算法运行所需要的额外空间

2.时间复杂度

2.1时间复杂度的概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间一个算法执行所耗费的时间,从理论上说是不能计算出来的,只有你把你的程序放在机器上跑起来,才能知道。但这样很麻烦,所以才有了时间复杂度这个分析方式,一个算法所花费的时间与其中语句的执行次数成正比,算法的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

//请计算Fun1中++count语句总共执行了多少次?
void Fun1(int N)
{
  int count=0;
  for(int i=0;i<N;++i)
  {
    for(int j=0;i<N;j++)
    {
      ++count;
    }
  }
  for(int k=0;k<2*N;++k)
  {
    ++count;
  }
  int M=10;
  while(M--)
  {
    ++count;
  }
  printf("%d\n",count);
}

准确次数:F(N)=N*N+2*N+10(时间复杂度的函数式)

  • N=10     F(N)=130
  • N=100    F(N)=10210
  • N=1000   F(N)=1002010
  • 发现:N越大,函数式后两项对结果的影响越来越小
  • 实际中我们计算时间复杂度时,我们其实并不一定要计算精准的执行次数,而只需要大概的执行次数,那么这里我们使用大O的渐进表示法
  • 时间复杂度:O(N^2)

大O的渐进表示法

大O符号:是用于描述函数渐进行为的数学符号

推导大O阶方法:

1.用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高阶项

3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶

举例:

void Fun2(int t)
{
  int count++;
  for(int k=0;k<2*N;++k)
  {
    ++count;
  }
  int M=10;
  while(M--)
  {
    ++count;
  }
  printf("%d\n",count);
}

准确复杂度:2*N+10 

F(N)=N           O(N)
















标签:int,复杂度,衡量,次数,算法,时间,空间
From: https://blog.51cto.com/u_16351083/9119953

相关文章

  • 经典算法问题之打印日期
    这也是一道经典的算法题。其实也是用两个数组。还有判断是否闰年。两个个循环,外面一个是月份循环,内部一个是每个月的天数循环,然后计数器Count++就行,直到和天数相同就跳出循环,打印就行。#include<stdio.h>intjudge(intyear){if(year%400==0||year%100!=......
  • 机器学习-决策树系列-Adaboost算法-集成学习-29
    目录1.adaboost算法的基本思想2.具体实现1.adaboost算法的基本思想集成学习是将多个弱模型集成在一起变成一个强模型提高模型的准确率,一般有如下两种:bagging:不同的basemodel可以并行计算,输出预测结果少数服从多数,回归问题则对多个模型输出的结果求平均。boosting:后一......
  • 代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合
    一、回溯算法理论基础学习:1.基本概念回溯法是一种搜索方式回溯的本质是穷举,是递归的副产品,即回溯算法就是递归算法回溯解决的问题都能理解成树形结构,一般是在集合中递归查找子集。集合的大小构成树的宽度(n叉树),递归的深度构成了树的深度2.回溯解决的问题(1)组合问题:N个......
  • 经典算法之天数问题
    这题算是非常经典的题目了。无非就是判断闰年然后计算天数而已。用两个month数组记录月份天数一三五七八十腊是31天,二月份非闰年28天,闰年29天,其余都是30天就好了。#include<stdio.h>intjudge(intyear){if(year%400==0||year%100!=0&&year%4==0......
  • 迈入AI智能时代!ChatGPT国内版免费AI助手工具 peropure·AI正式上线,打造场景化智慧服务
     当OpenAI发布ChatGPT的时候,没有人会意识到,新一代人工智能浪潮将给人类社会带来一场眩晕式变革。其中以ChatGPT为代表的AIGC技术加速成为AI领域的热门发展方向,推动着AI时代的前行发展。面对技术浪潮,清越科技(PeroPure)立足多样化生活场景、精准把握用户实际需求,持续精确Fine-......
  • C语言逆波兰式算法
    1#include<stdio.h>23//数字模式识别4#defineIS_NUM(c)(((c)>='0')&&((c)<='9')||((c)=='.'))5//符号字符识别6#defineIS_OPERATOR(c)(((c)=='+')||((c)=='-')||((c)==&......
  • 2024年小红书最新x-s-common签名算法分析以及点赞api接口测试nodejs(2024-01-05)
      2024年小红书又更新了x-s-common算法,现在的版本是:3.6.8。这个签名算法现在是越来越重要了,许多接口都要用到。比如:评论,点赞等接口,没有这个算法采集不到数据。  一、chrome逆向x-s-common算法  1、x-s-common  打开chrome,按f12,打开开发者模式,随便找一接口,全局......
  • 经典算法之图形问题
    图形问题的万金解决方法就是创建一个二维数组,然后将填数组,最后打印数组就行了。其本质还是找出图形的规律。首先来找规律,先从外形上来找。奇数高,看图形,是上下左右对称的。所以只找上半区的规律。然后首行比其他行少两个字符也就是多两个空格,最外层都是A,数组可以提前都赋值。只......
  • 排序算法
    冒泡排序思想:1、一个无序的数组,n个元素,一共需要排序n-1轮2、在每一轮中,从数组第0位开始,比较相邻两个元素,如果与需求逆序,就交换这两个元素,在每一轮中,可以将当前最大(最小)的元素交换到最后,3、直到执行完n-1轮,没有需要比较的元素为止。代码实现:publicstaticvoidbubSort(in......
  • 小尺寸、可节省电路板空间的 MCS1801GS-25、MCS1801GS-12、MCS1800GS-12、MCS1800GS-2
    典型应用:•电机控制•汽车系统•负载检测和管理•开关模式电源•过流故障保护器件说明:MCS180x线性霍尔效应电流传感器具有小尺寸,可节省电路板空间,非常适合空间受限的应用。该系列采用SOIC-8封装,提供卷带选项。MCS180x模块用于交流和直流电流检测。霍尔阵列是差分的,它抵消了杂散......