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

2023-10-31

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

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_数据结构的基本概念

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++数据结构X篇_01_数据结构的基本概念 的相关文章

  • 如何引用 .net 可执行文件中的类?

    IL 反汇编程序显示了我想在项目中使用的 Net 可执行文件中的类 我如何使用我自己项目中的这些类 从 Visual Studio 上的项目添加对该可执行文件的引用 您应该有权访问它定义的公共类 可执行文件是一个像任何其他程序集一样的程序集
  • 为什么我需要显式编写“auto”关键字?

    我正在从 C 98 转向 C 11 并且已经熟悉了auto关键词 我想知道为什么我们需要明确声明auto编译器是否能够自动推导类型 我知道 C 是一种强类型语言 这是一条规则 但如果不显式声明变量就不可能实现相同的结果auto 放弃显式的a
  • JQuery、ASCX 和 webmethods 似乎不起作用

    我有一个级联下拉列表 其中 3 个 类型 类别和子类别 首先类型负载 然后选择类型 类别负载以及选择类别 子类别负载 我还有 2 个按钮 添加类别 和 添加子类别 单击这些按钮后 我调用 JQuery 模态表单来添加它们 我在代码后面使用
  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • 如何设置 web.config 文件以显示完整的错误消息

    我在 Windows Azure 上部署了 MVC 3 应用程序 但现在当我通过请求时staging url它告诉我 很抱歉 在执行您的要求时发生了一个错误 现在我想查看完整的错误消息 默认情况下由于某些安全原因它会隐藏该消息 我知道我们可
  • 有什么办法可以让这个 C# 代码更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在读取一个大文件 X12 并解析其中的信息 我有两个瓶颈功能 我似乎无法解决 read line 和 get element 有什
  • 有没有办法使用 ews c# 确定电子邮件是否是回复/响应?

    我正在编写一个支持系统 这是我第一次使用 EWS 到目前为止 我已经相当成功了 我可以提取我需要的信息 发送电子邮件 一切正常 我确实有点头疼 有没有办法判断电子邮件是否实际上是回复 该应用程序的基本思想是有人发送电子邮件 我们回复并给他们
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 如何检查我的程序是否有数据通过管道传输到其中

    我正在编写一个应该通过标准输入读取输入的程序 所以我有以下结构 FILE fp stdin 但是 如果用户没有将任何内容通过管道传输到程序中 这就会挂起 我如何检查用户是否确实将数据通过管道传输到我的程序中 例如 gunzip c file
  • 使用 itextSharp 5.3.3 对 Pdf 文档进行数字签名和验证

    我正在尝试使用 iTextSharp 5 3 3 在服务器 c 上进行数字签名和验证 pdf 文档 我使用 DigiSign 在线工具 生成了 Pfx 文件 然后使用 Windows 生成证书 cer 文件
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • 如何声明返回相同类型的 Func Delegate 的 Func Delegate?

    我想编写一个方法 该方法可以完成一些工作 并最终返回另一个与原始方法具有相同签名的方法 这个想法是根据前一个字节值顺序处理字节流 而不进行递归 通过这样调用它 MyDelegate executeMethod handleFirstByte
  • 在 Windows 上构建 MLT 框架时出错

    我一直在遵循官方提供的构建指南here http www mltframework org bin view MLT WindowsBuild 我需要 MLT 来创建视频播放器 并且我选择仅安装前 4 个库 如指南中所述 FFmpeg SD
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 使用智能指针在大型对象集合中创建多个索引

    我正在为一个大型对象集合创建多个索引 即使用不同的键 对象可以改变 集合可以缩小和增长 到目前为止我的想法 保留某种指向对象的指针的多个集合 使用set代替map以获得更好的封装 使用 unordered set 可以很好地扩展大型数据集
  • 使用 System.Windows.Forms.Timer.Start()/Stop() 与 Enabled = true/false

    假设我们在 Net 应用程序中使用 System Windows Forms Timer 在计时器上使用 Start 和 Stop 方法与使用 Enabled 属性之间有什么有意义的区别吗 例如 如果我们希望在进行某些处理时暂停计时器 我们
  • 如何使用 XmlSerializer 生成标记前缀

    我想使用 XmlSerializer 生成以下内容
  • nVidia 和 ATI 之间的 OpenGL 渲染差异

    最近 我将 ATI 驱动程序 我使用的是 HD7970 更新为最新版本 但我的 OpenGL 项目的一些对象停止工作 更重要的是 他们适用于 nVidia 最新驱动程序 在 960m 上测试 ATI 和 nVidia 渲染管道之间有什么我应

随机推荐