数据结构 > 算法的时间复杂度(1)

目录

1.算法效率

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

1.2算法的复杂度

1.3复杂度在校招中的考察

2.时间复杂度

2.1时间复杂度的概念

2.2大O的渐进表示法

2.3特殊情况


1.算法效率

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

如何衡量一个算法的好坏呢?比如对于以下斐波那契数列:

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

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

1.2算法的复杂度

 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间,在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很是在乎;但是经过计算机行业的快速发展,计算机的存储容量已经达到了很高的程度,所以我们如今已经不需要特别关注一个算法的空间复杂度

1.3复杂度在校招中的考察

校园招聘的在笔试算法题和面试中都会考察对复杂度的计算和理解

2.时间复杂度

2.1时间复杂度的概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数(数学中的函数式),它定量描述了该算法的运行时间,一个算法执行所耗费的时间,从理论上来讲,是不能被算出来的,只有程序在机器上跑起来才能知道,但是上机测试很明显是有限的,所以才有了时间复杂度这个分析方式

一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度

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

我们举个例子:

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

我们画图分析一下 

Func1执行的基本操作次数:

F(N)=N*N+2*N+10

  • N=10                F(N)=130
  • N=100              F(N)=10210
  • N=1000            F(N)=1002010

我们转化一下这个表达式,保留对它影响最大的项,即N*N

那这个表达式就变成了

F(N)=N*N

  • N=10                F(N)=100
  • N=100              F(N)=10000
  • N=1000            F(N)=1000000

我们可以看到,N越大,后两项对结果的影响越小 

所以时间复杂度为:O(N^2)

2.2大O的渐进表示法

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

推导大O阶方法:

  1. 用常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是一,则去除与这个项目相乘的常数(系数),得到的结果就是大O阶

一般情况下,时间复杂度计算时未知数都是用的N
但是也可以是其他的

注意:O(1)并不是代表代码只运行一次,而是运行常数次

2.3特殊情况

有些算法的时间复杂度存在最好、平均和最坏的情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N的数组中搜索一个数据x

  • 最好情况:1次找到
  • 最坏情况:N次找到
  • 平均情况:N/2次找到

当一个算法随着输入不同,时间复杂度也不同,时间复杂度做悲观预期,看最坏的情况

即在这个例子中我们取O(N)

3.总结

那么今天的学习就到这里咯,今天我们学习了算法的时间复杂度的知识

小杜跟各位小伙伴在一起成长,祝我们都能成为大牛!

                                                                                                                                //小杜的成长之路
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108434.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qiankun 子应用 ant-design-vue快速填坑指南

qiankun 子应用使用 ant-design-vue v3 问题 Cascader无法显示下拉Form label 显示混乱Message 提示报错等各种样式不兼容问题… 解决办法 子应用 ant-design-vue v3 升v4 官网文档子应用 ant-design-vue ConfigProvider prefixCls全局化修改 设置统一样式前缀&#xff0c;…

【AI】机器学习——线性模型(线性回归)

线性模型既能体现出重要的基本思想&#xff0c;又能构造出功能更加强大的非线性模型 参考&#xff1a;唐宇迪机器学习课程 文章目录 3.1 线性模型3.1.1 数据3.1.2 目标/应用 3.2 线性回归3.2.1 回归模型历史3.2.2 回归分析研究内容回归分析步骤 3.2.3 回归分析分类3.2.4 回归模…

Boost搜索引擎

项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…

【Java从入门到精通】这也许就是Java火热的原因吧!

前言&#xff1a;Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类&#xff1a;JavaSE&#xff08;Standard Edition&#xff0c;标准版&#xff09;&#xff1a;支持面向桌面、嵌入式和移动设备的应用程序开发&#xff1b;JavaEE&…

阿里云服务器配置选择指南(2023新版教程)

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南&#xff0c;阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等&#xff0c;阿小云分享阿里云服务器配置选择方法&#xff0c;选择适合自己的云服务器…

vue cli 打包、生产环境http-proxy-middleware代理

结构树 版本 1、创建vue.config.js const path require(path); const UglifyJsPlugin require(uglifyjs-webpack-plugin) //压缩 const CompressionWebpackPlugin require(compression-webpack-plugin) const isProduction process.env.NODE_ENV ! development;module.exp…

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…

线性回归方程

性回归是利用数理统计中的回归分析来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法&#xff0c;是变量间的相关关系中最重要的一部分&#xff0c;主要考查概率与统计知识&#xff0c;考察学生的阅读能力、数据处理能力及运算能力&#xff0c;题目难度中等&…

导出excel单元格时实现换行

上一篇&#xff1a;laravel中安装Maatwebsite/excel扩展 承接上一篇哈&#xff0c;laravel成功安装了excel的扩展&#xff0c;但是有个小的问题&#xff0c;就是每个题目有至少两个选项&#xff0c;导出到excel的时候&#xff0c;希望每个选项之间能换行展示&#xff0c;也就是…

vue中转换base64文件数据后通过blob下载

可以看到这里我要转换的数据是content字段&#xff0c;即将base64文件数据转换后下载下来&#xff1a; downloadAttachment({ attachmentId: id }).then(({ data }) > {proxy.$modal.closeLoading();// atob先解码base64数据const raw window.atob(data.content);// 获取解…

移除数组中指定元素的所有数

给你一个数组 nums 和一个值 val&#xff0c;你需要 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 思路1&#xff1a;暴力查找——覆盖法&#xff0c;遇到一次val就挪动后面的数据删除 代码 int removeElement(int* nums, int numsSize, int val) {int…

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告&#xff0c;但不能保证该广告变现能力强。莫比乌斯做了如下两点创新&#xff1a; 在召回阶段&#xff0c;引入CPM等业务指标作为召回依据在召回阶段&#xff0c;引入CTR模型&#xff0c;从而召回更多相关性高且变现能力强的广告 参考 百度…