【数据结构】还不懂算法复杂度?一文带你速解

前言:

前面我们已经系统的学完C语言的相关知识,现在我们已经较为熟练的掌握了C语言中的各中代码语法和结构使用,能够使用代码来解决一些简单问题。但是对于一个程序员来说,仅仅会语法是远远不够的,从今天开始,我们将进入到数据结构的学习。

一、初始数据结构:

  1. 数据结构:

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的 数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行和存储效率。数据结构往往同高效的检索算法和索引技术有关。

2.算法:

算法(Algorithm):就是定义良好的计算过程,它取一个或一组的值为输入,病残生出一个或一组值作为输出。见来说算就是一系列计算步骤用来将输入数据转化为输出结果。

算法具有以下五个特点:

①有穷性: 指算法必须能在执行有限个步骤之后终止;
②确切性: 算法的每一个步骤必须有确切的定义;
③输入项: 一个算法有0个或者多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
④输出项: 一个算法有一个或多个输出,以反映对输入数据加工后的结果;
⑤可行性: 算法中执行的任何计算机步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都快要有限时间内完成。

常见的算法思想:递推法、递归法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法,回溯法。

二、算法效率:

算法的效率可以分为两种:时间效率和空间效率。

时间效率顾名思义就是指算法执行的时间,依据改算法编制的程序在计算机上运行时所消耗的时间来度量。空间效率指的是程序运行所需占用的空间,根据该算法编制的程序在计算机上运行时所占用的全部空间来度量。总而言之,算法效率其实就是为了研究算法的好坏而生的。而我们在衡量算法的好坏时,通常从时间和空间这两个角度出发的。从时间维度出发研究算法的时间复杂度,从空间维度出发研究算法的空间复杂度

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

  1. 时间复杂度:

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,一个算法执行所消耗的时间,从理论上讲是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道,但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,而且随着科技的发展,现在不同的电脑cpu差距很大,又可能在一个电脑跑10s的程序,到另一个电脑就需要15s了,所以才有了时间复杂的这个分析方式。一个算法所花费的时间于其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模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;
}

上述代码中,第一部分的嵌套循环共执行了N的平方(N^2);第二部分的循环共执行了N*2次,第三部分共执行了10次,因此这段代码的时间复杂度F(N):

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

也就是:
N = 10 F(N) = 130 N = 100 F(N) = 10210 N = 1000 F(N) = 1002010

但是在实际中,我们在计算时间复杂度时,并不一定要计算精确的执行次数(从上面的示例我们就可发现,随着N增大,时间复杂度与N*2+10的关系越来越小,时间复杂度取决于最高次幂N^2),而只需要大概执行次数就可以了,于是我们通常用大O的渐进表示法来表示算法的时间复杂度。

2.大O渐进表示法

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

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

例如上面的时间复杂度使用此方法表示为:O(N^2)。即通过使用此方法,去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

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

最坏情况:任意输入规模的最大运行次数(上界) 平均情况:任意输入规模的期望运行次数 最好情况:任意输入规模的最小运行次数(下界) 例如:在一个长度为N数组中搜索一个数据x 最好情况:1次找到 最坏情况:N次找到 平均情况:N/2次找到

而在我们在实际中的一般情况下关注的是算法的最坏运行情况。

3.空间复杂度:

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度 不是程序占用了多少bytes的空间,因为对于如今的技术这个也没太大意义,所以 空间复杂度算的是变量的个数。 空间复杂度计算规则 基本跟时间复杂度类似,也使用大O渐进表示法。 注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

例如:

void BubbleSort(int* a, int n)
{

 assert(a);
 for (size_t end = n; end > 0; --end)
 {
     int exchange = 0;
     for (size_t i = 1; i < end; ++i)
     {
         if (a[i-1] > a[i])
        {
         Swap(&a[i-1], &a[i]);
         exchange = 1;
        }
      }
     if (exchange == 0)
     break;
 }
}

在上述代码中,出去原本就存在的的量的空间外,额外定义的变量有end、i和exchange,共三个,则空间复杂度的表达式F(N)=3;其表达式为常数,大O表示为O(1);

总结:

今天是我们初识数据结构,到此我们对数据结构有了一个大致的了解,同时学会了计算算法的时间复杂度和空间复杂度,学会这两个我们就可以更加精确的优化我们的代码。

本文仍有许多不足,欢迎各位随时批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux】多线程概念详述

文章目录一、线程基本概念1.1 进程地址空间与页表1.2 页表结构1.3 线程的理解1.3.1 如何描述线程1.4 再谈进程1.5 代码理解1.5.1 原生库提供线程pthread_create1.6 资源共享问题1.7 资源私有问题二、总结2.1 什么是线程2.2 并行与并发2.3 线程的优点2.4 线程的缺点2.5 线程异常…

OpenCV实战——拟合直线

OpenCV实战——拟合直线0. 前言1. 直线拟合2. 完整代码相关链接0. 前言 在某些计算机视觉应用中&#xff0c;不仅要检测图像中的线条&#xff0c;还要准确估计线条的位置和方向。本节将介绍如何找到最适合给定点集的线。 1. 直线拟合 首先要做的是识别图像中可能沿直线对齐的…

7个最受欢迎的Python库,大大提高开发效率

当第三方库可以帮我们完成需求时&#xff0c;就不要重复造轮子了 整理了GitHub上7个最受好评的Python库&#xff0c;将在你的开发之旅中提供帮助 PySnooper 很多时候时间都花在了Debug上&#xff0c;大多数人呢会在出错位置的附近使用print&#xff0c;打印某些变量的值 这个…

设计模式之单例模式~

设计模式包含很多&#xff0c;但与面试相关的设计模式是单例模式&#xff0c;单例模式的写法有好几种&#xff0c;我们主要学习这三种—饿汉式单例&#xff0c;懒汉式单例、登记式单例,这篇文章我们主要学习饿汉式单例 单例模式&#xff1a; 满足要点&#xff1a; 私有构造 …

同一片天空共眠,同一个梦想奋斗《大抠车始歌》(1)

同一片天空共眠&#xff0c;同一个梦想奋斗《大抠车始歌》&#xff08;1&#xff09; English version&#xff1a;Sleeping under the same sky, chasing the same dream - "The Beginning Song of Dakouche" (1) 飞链云 《Sleeping under the same sky, chasing …

Nacos 注册中心 - 健康检查机制源码

目录 1. 健康检查介绍 2. 客户端健康检查 2.1 临时实例的健康检查 2.2 永久实例的健康检查 3. 服务端健康检查 3.1 临时实例的健康检查 3.2 永久实例服务端健康检查 1. 健康检查介绍 当一个服务实例注册到 Nacos 中后&#xff0c;其他服务就可以从 Nacos 中查询出该服务…

jupyter的安装和使用

目录 ❤ Jupyter Notebook是什么&#xff1f; notebook jupyter 简介 notebook jupyter 组成 网页应用 文档 主要特点 ❤ jupyter notebook的安装 notebook jupyter 安装有两种途径 1.通过Anaconda进行安装 2.通过pip进行安装 启动jupyter notebook ❤ jupyter …

10 个超赞的 C 语言开源项目

今天给大家分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;01.WebbenchWebbench是一个在 Linux 下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的性能。最多可以模拟 3…

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…

《C++ Primer Plus》(第6版)第12章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第12章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第12章编程练习1. Cow类2. String类3. Stock类4. Stack类5. 排队时间不超过1分钟6. 再开设一台ATM&#xff0c;重新求解第五题《C Primer Plus》&#xff08;第6版…

JAVA 多线程

目录 P1多线程01&#xff1a;概述 P2多线程02&#xff1a;线程、进程、多线程 P3多线程03&#xff1a;继承Thread类 P4多线程04&#xff1a;网图下载 P5多线程05&#xff1a;实现Runnable接口 P6多线程06&#xff1a;初识并发问题 P7多线程07&#xff1a;龟兔赛跑 P8多…

PyTorch深度学习实战 | 搭建卷积神经网络进行图像分类与图像风格迁移

PyTorch是当前主流深度学习框架之一&#xff0c;其设计追求最少的封装、最直观的设计&#xff0c;其简洁优美的特性使得PyTorch代码更易理解&#xff0c;对新手非常友好。本文为实战篇&#xff0c;介绍搭建卷积神经网络进行图像分类与图像风格迁移。1、实验数据准备本文中准备使…

汇编语言与微机原理(1)基础知识

前言&#xff08;1&#xff09;本人使用的是王爽老师的汇编语言第四版和学校发的微机原理教材配合学习。&#xff08;2&#xff09;推荐视频教程通俗易懂的汇编语言&#xff08;王爽老师的书&#xff09;&#xff1b;贺老师C站账号网址&#xff1b;&#xff08;3&#xff09;文…

10分钟搞定win11安卓子系统

10分钟搞定win11安卓子系统Android子系统的要求一、安装 Windows 虚拟化支持二、Win11 正式版安装安卓子系统方法教程 (离线包安装)三、在Win11 安卓子系统安装 APK 软件包教程Windows 11 WSA 安装 APK 方法&#xff1a;Windows 11上成功运行安卓APP安装国内的 Android 应用商店…

Java序列化与反序列化

优秀博文&#xff1a;IT-BLOG-CN 序列化&#xff1a;把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。 反序列化&#xff1a;把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口Serializabl…

Spring注解驱动开发--AOP底层原理

Spring注解驱动开发–AOP底层原理 21. AOP-AOP功能测试 AOP&#xff1a;【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式&#xff1b; 1、导入aop模块&#xff1a;Spring AOP&#xff0c;(Spring-aspects) 2、定义一个业务逻辑类(Ma…

Git和Github的基本用法(内含如何下载)

Git和Github的基本用法背景下载安装安装 git for windows使用 Github 创建项目注册账号创建项目下载项目到本地Git工作流程Git 操作的三板斧放入代码三板斧第一招: git add三板斧第二招: git commit三板斧第三招: git push小结背景 git是一个版本控制工具. 主要解决三个问题 代…

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解I2C的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…

蓝桥杯嵌入式第八课--EEPROM读写

前言E2PROM的读写主要是考察IIC的使用&#xff0c;但是在比赛当中I2C的各种驱动文件都是直接给出的&#xff0c;因此我们需要做的工作就是根据EEPROM的读写时序配出读写的函数来。EEPROM硬件连接图我们可以看到IIC的数据线&#xff08;已上拉&#xff09;有两路去处&#xff0c…

C语言详解KMP算法

如果给你一个字符串 和 该字符串的一个子字符串 你能否快速找出该子字符串的所在位置我猜 这里会有一群杠精 说可以找到 真的吗 那下面这个字符串你可以一眼看出来吗你能找出来吗 如果能 算你眼神好 如果不能 那就看看接下来我怎么做你有想到暴力求解法吗&#xff1f;——来自百…
最新文章