C++数据结构X篇_01_数据结构的基本概念

news2024/9/22 21:17:39

从本篇开始学习数据结构相关概念。

数据结构的基本概念

  • 1 数据结构的相关概念
    • 1.1 为什么要学习数据结构
    • 1.2 数据结构中的基本概念
  • 2 算法
    • 2.1 算法的概念
    • 2.2 算法和数据结构的区别
    • 2.3 算法特性
    • 2.4 算法效率的度量
      • 2.4.1 事后统计法
      • 2.4.2 事前分析估算
      • 2.4.3 大O表示法
        • 2.4.3.1采用大O表示法表示算法的时间复杂度的相关练习

1 数据结构的相关概念

1.1 为什么要学习数据结构

数据结构与之前的设计模式具有相似的特点,均是思想层面的东西,与具体的语言无关,因此使用其他的语言去实现这些思想也都是可以的。
设计模式是在教我们如何编写代码,让代码具有可扩展性,这个是编码层次的,数据结构呢?有以下一个例子
在C语言中是没有数组这个数据结构的,那么如何去实现10个数的排序呢?这就需要我们自己定义10个变量,然后将10个变量互相比较,重复劳动,但是使用数组之后,问题就会变得简单,只需要通过数组下标就可以,从而提高了程序的编写效率。
再比如说,在已经有数组的情况下,为什么还是需要学习链表这种数据结构?
数组是连续内存空间,一旦定义了不能改变,适应性差,但是链表你有多少数据,就可以创建多少个节点,比如说数据,你删除中间位置一个元素,会引起后边数据的移动,但是链表就不会,在有些情况下,使用链表会增加程序的效率。

从以上可以看出数据结构的概念,数据结构就是帮助我们解决如何组织和存储数据的方式
数据结构主要研究:非数值计算问题的程序中的操作对象以及他们之间的关系,不是研究复杂的算法 数据结构是计算机存储,组织数据的方式

1.2 数据结构中的基本概念

在这里插入图片描述
在这里插入图片描述

2 算法

2.1 算法的概念

为什么学习数据结构还需要了解算法?
比如说:将10个学生信息保存到一个链表中,但是不能只是简单的将数据存储进去,还需要根据一定的业务需求,比如按照成绩大小排序并显示,比如计算这些学生的平均分等,这些才是我们最终要解决的问题,既然要解决问题,那么就需要一些算法,比如排序算法,比如计算平均分的算法。所以数据结构和算法是互相配合完成工作。
算法是特定问题求解步骤的描述,在计算机中表现为指令的有序排列,算法是独立存在的一种解决问题的方法和思想。
对于算法而言,语言并不重要,重要的是思想。

2.2 算法和数据结构的区别

数据结构只是静态的描述了数据元素之间的关系,高效的程序需要在数据结构的基础上设计和选择算法。

  • 算法是为了解决实际问题而设计的
  • 数据结构是算法需要处理的问题载体
  • 数据结构与算法相辅相成

2.3 算法特性

在这里插入图片描述
问题:针对某一具体的问题,针对这一问题算法是唯一的吗?
答案是不唯一的

比如说:求1到100的和
算法1:程序申请堆空间,返回空间内存首地址–>将数据放到内存中–>对内存中数据进行累计得到1到n的和
在这里插入图片描述
算法2:直接采用for循环来进行计算
在这里插入图片描述
算法3:通过数学公式来进行计算
在这里插入图片描述
同样的一个问题,有三种不同的算法,这三种算法都可以解决同样的问题,那么如何进行选择?需要有个方法来衡量算法的效率

2.4 算法效率的度量

2.4.1 事后统计法

此种方法仅做了解,主要是通过设计好的测试程序和数据,利用计算机的计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低

  • 统计方法
    比较不同算法对同一组输入数据的运行处理时间
  • 缺陷
    -为了获得不同算法的运行时间必须编写相应程序;
    -运行时间严重依赖硬件以及运行时的环境因素;
    -算法的测试数据的选取相当困难
  • 总结
    事后统计法虽然直观,但是实施困难且缺陷多

2.4.2 事前分析估算

在计算机程序编制前,依据统计方法对算法进行估算。根据最终编译成的具体的计算机指令,每条指令运行时间固定,通过推导的方式得到算法的复杂度。

  • 统计方法
    -依据统计的方法对算法效率进行估算

  • 影响算法效率的主要因素:
    -算法采用的策略和方法;
    -问题的输入规模;
    -编译器所产生的代码;
    -计算机执行速度

  • 算法推导的理论基础
    -算法最终编译成具体的计算机指令;
    -每一个指令,在具体的计算机上运行速度固定;
    -通过具体的步骤,就可以推导出算法的复杂度(如下表)
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 怎么判断一个算法的效率?(规则如下)
    -判断一个算法的效率时,往往只需要关注操作数量的最高次项,其他次要项和常数项可以忽略(例如上面的操作次数,当n不同时,每一个算法的具体执行次数是不同的,只看20000000000最高次项的值);
    -在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度(最worst情况下的);
    -只有常数项记作1;
    -操作数量的估算可以作为时间复杂度的估算

2.4.3 大O表示法

本课程重点讲解的方法

  • 算法的时间复杂度
    -常见的时间复杂度
    在这里插入图片描述
    常见时间复杂度之间的关系
    在这里插入图片描述
    在这里插入图片描述
    总结:
    只关注最高次项
    时间复杂度是指最坏时间复杂度
    只有常数项记作1

-算法的空间复杂度
算法的空间复杂度并不是计算所有算法所占的空间,而是使用的辅助空间的大小

2.4.3.1采用大O表示法表示算法的时间复杂度的相关练习

算法1:
在这里插入图片描述
算法1的程序中代码总共会执行3步,次数为常数项,用大O表示法为:O(1)

算法2:
在这里插入图片描述
算法2的程序中代码总共会执行12步,次数为常数项,用大O表示法为:O(1)

算法3:
在这里插入图片描述
算法3的执行次数与n相关,使用O(n)进行表示

算法4:
在这里插入图片描述
算法4中count22*…,以2的n次方接近n,也就是2x=n,x=log2n,利用大O表示法表示为O(logN)
logaN=logcN/logca,如果算法复杂度的最高次项的乘数,如果不是1的话就直接舍去,对于算法复杂度logaN来说,其最高次项就是logcN*1/logca,其乘数1/logca不是个1,可以直接省掉,也就变为logcN,c可以是任意值,因此表示为logN。

算法5:
在这里插入图片描述
算法5利用大O表示法表示为O(n^2)

算法6
在这里插入图片描述

算法6执行次数为n+(n-1)+(n-2)+…+1=n(n+1)/2,只关注最高次项,n/2舍去,n^2/2的乘数1/2不为1,也就舍去,因此也用O(n方)表示

算法7
在这里插入图片描述
算法7用O(n)表示

算法8
在这里插入图片描述
算法8的执行次数为1+n+n^2+n(n+1)/2,进行综合之后只关心最高项就用O(n方)表示

3.视频学习地址参考C++数据结构X篇_01_数据结构的基本概念

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从事先进计算的工程师对此都有什么感想?

电子计算机最初诞生于二十世纪,体积庞大的初代机型运算能力有限,随着计算技术的升级完善,现在多样小巧的计算机及手机的计算能力呈指数级增长,更是成为人们生活密不可分的综合性助手。 先进计算是在计算的基础上诞生的全新概念&a…

Python3安装及基础语法

Python 官网:Welcome to Python.org Python安装:进入官网Download找到对应版本安装包,下载后双击安装,一直下一步即可;注意:安装最后一步勾选(Add Python to PATH),默认…

用nginx作反向代理时,请求头中含波浪线无法转发请求的解决方法

请求头如下 POST /CDGServer3/s/rs/uni HTTP/1.1 Content-Type: text/html; charsetUTF-8 method~name: upgradePatchService user~userId: admin.local user~clientId: 343834353230344334424431 user~SessionID: 0 data~packageNo: 618 data~packageState: 1 User-Agent: Ra…

Android -- 每日一问:怎么理解 Activity 的生命周期?

典型回答 如果一个 Activity 在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销 BroadcastReceiver 呢? Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户…

nginx(六十四)proxy模块(五)接收上游响应

一 接收上游的响应 前提: nginx与上游建立连接,把nginx生成的请求(line、header、body)信息发送给上游补充: 上游解析处理完之后,会发送响应​核心: nginx如何接收、解析、处理上游响应行、响应头、响应体 下载大文件失败 (…

一文了解 Go 的复合数据类型(数组、Slice 切片、Map)

一文了解 Go 的复合数据类型[数组、切片 Slice、Map]前言数组数组的创建方式数组的遍历Slice 切片切片的创建方式切片的遍历向切片追加元素MapMap 的创建方式Map 的基本操作插入和修改删除查找操作遍历操作删除操作小结耐心和持久胜过激烈和狂热。 前言 上一篇文章一文熟悉 Go…

CMake Cookbook by Eric

I. Basics 关键字&#xff1a;CMake中的构建指令 指令的书写是大小写无关的&#xff1b; II. Project&#xff1a;指定项目名称和语言类型 命令格式&#xff1a;project(<PROJECT-NAME> [<language-name>...]) Note 项目名称<PROJECT-NAME>不需要与项目根…

论文阅读【7】HHM隐马尔科夫模型

1.隐马尔科夫模型&#xff08;HMM&#xff09;的介绍 隐马尔科夫模型有两个序列&#xff0c;上面一层序列的值称之为影藏值(隐式变量)&#xff0c;下面一个序列中的值被称为观察值&#xff0c;想这个的序列模型被称为生成模型&#xff08;Generate model&#xff09;。z表示的是…

Linux - lsof显示 tcp,udp 的端口和进程

文章目录功能语法示例lsof -i 显示 tcp&#xff0c;udp 的端口和进程等相关查看服务器 80 端口的占用情况使用 -p 查看指定进程打开的文件更多命令功能 lsof&#xff08;list open files&#xff09;是一个列出当前系统打开文件的工具。 lsof 需要访问核心内存和各种文件&…

【区块链技术与应用】(八)

https://blog.csdn.net/lakersssss24/article/details/125762826?spm1001.2014.3001.5501 https://blog.csdn.net/lakersssss24/article/details/126434147 https://blog.csdn.net/lakersssss24/article/details/126671408?spm1001.2101.3001.6650.3&utm_mediumdistribut…

[附源码]java毕业设计医院仪器设备管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

cubeIDE开发, stm32的OLED点亮及字符显示设计(基于SPI通信)

一、SPI 通信技术 显示屏&#xff08;LCD、OLED&#xff09;接口一般有I2C、SPI、UART、RGB、LVDS、MIPI、EDP和DP等。一般3.5寸以下的小尺寸LCD屏&#xff0c;显示数据量比较少&#xff0c;普遍采用低速串口&#xff0c;如I2C、SPI、UART。SPI&#xff08;Serial Peripheral I…

通用后台管理系统前端界面Ⅹ——前端数据表格的删除、查找

删除操作 1、拿到id或者行数据对象 2、查看后端接口方法&#xff0c;写api方法&#xff0c;将操作连接上后端 后端请求操作成功&#xff0c;但是前端数据表格未更新&#xff0c;最简单的一种方法数据删除后要重新获取数据》 依旧显示成功&#xff0c;但是前端数据表格未变化&…

Bert and its family

Bert没有办法一次性读入特别长的文本的问题。自注意力机制非常消耗时间和空间。 概率值最大取argmax&#xff0c;对应的下标 整体全部更新&#xff0c;所有参数都更新&#xff0c;比固定住pre-trained要好很多。 不做预训练&#xff0c;loss下降比较慢&#xff0c;收敛比较慢&a…

BIM在工程中的20种典型功能

1、BIM模型维护 根据项目建设进度建立和维护BIM模型&#xff0c;实质是使用BIM平台汇总各项目团队所有的建筑工程信息&#xff0c;消除项目中的信息孤岛&#xff0c;并且将得到的信息结合三维模型进行整理和储存&#xff0c;以备项目全过程中项目各相关利益方随时共享。 由于…

Java 微信关注/取消关注事件

Java 微信关注/取消关注事件一、需求、思路二、文档、配置配置步骤1配置步骤2三、代码1、引入依赖包2、controller3、封装消息对象4、service、解密5、工具包一、需求、思路 需求&#xff1a;用户订阅/取消订阅公众号时接收消息并保存到数据库中以便后续功能的处理。 思路&…

【分类-SVDD】基于支持向量数据描述 (SVDD) 的多类分类算法附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

机器学习-回归模型相关重要知识点

目录01 线性回归的假设是什么&#xff1f;02 什么是残差&#xff0c;它如何用于评估回归模型&#xff1f;03 如何区分线性回归模型和非线性回归模型&#xff1f;04 什么是多重共线性&#xff0c;它如何影响模型性能&#xff1f;05 异常值如何影响线性回归模型的性能&#xff1f…

Springboot Security 前后端分离模式自由接口最小工作模型

但凡讲解Springboot Security的教程&#xff0c;都是根据其本身的定义&#xff0c;前后端整合在一起&#xff0c;登录采用form或者basic。我们现在的很多项目&#xff0c;前后端分离&#xff0c;form登录已经不适用了。很多程序的架构要求所有的接口都采用application/json方式…

RabbitMQ顺序性、可靠性、重复消费、消息堆积解决方案

RabbitMQ顺序性、可靠性&#xff08;消息丢失&#xff09;、重复消费、消息堆积解决方案 顺序性 RabbitMQ使用过程中&#xff0c;有些业务场景需要我们保证顺序消费&#xff0c;例如&#xff1a;业务上产生三条消息&#xff0c;分别是对数据的增加、修改、删除操作&#xff0…