数据结构与算法C语言版学习笔记(1)-绪论

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、数据结构的研究内容
  • 二、基本概念与术语
    • 1.数据与数据元素
    • 2.数据结构
      • 逻辑结构的种类
      • 存储结构的种类
  • 三、算法
    • 1.什么是算法?算法的描述
    • 2.一个算法要具备的特性
    • 3.算法设计的要求?
  • 四、衡量算法优劣的两个重要特性:时间复杂度和空间复杂度
    • 1.对于时间复杂度,直接上例子:
      • 例①
      • 例二
      • 例三
      • 例四
    • 2.时间复杂度的其他情况
    • 3.渐进空间复杂度


一、数据结构的研究内容

举个例子:
研究一个班级成绩表,表里有同学的名字、学号、成绩、排名,要进行增删改查操作——线性表
研究一个大文件夹里面的小文件夹,进行增删改查——树状结构
研究地图导航,要求一个地点到另一个地点的最短路径——网状结构

共性:无法用数学方式来描述这类问题,是非数值计算问题。

二、基本概念与术语

1.数据与数据元素

数据:
在这里插入图片描述
数据元素:
在这里插入图片描述
数据项:数据项是构成数据元素的不可分割的最小单位。
在这里插入图片描述
数据对象:性质相同的数据元素的集合。

2.数据结构

在这里插入图片描述
这里引出了一个关键性的知识:逻辑结构和存储结构。
我以C语言为例:
我们定义一个const int a[5],那么这5个元素在逻辑结构上就是线性排列的,而从计算机内部存储结构,他们被依次存入flash内存中,地址是连续的
在这里插入图片描述

逻辑结构的种类

在这里插入图片描述
(1)线性结构:线性结构是指数据元素之间存在一对一的关系,数据元素之间只有一个直接前驱和一个直接后继。

①线性表:线性表是具有相同数据类型的 n 个数据元素的有限序列,其中元素之间的关系是一对一的关系。常见的线性表有数组和链表。
②栈:栈是一种特殊的线性表,只能在一端进行插入和删除操作,即后进先出(LIFO)的原则。
③队列:队列也是一种特殊的线性表,只能在一端进行插入操作,在另一端进行删除操作,即先进先出(FIFO)的原则。
④串:串是一种特殊的线性表,它是由零个或多个字符组成的有限序列,其中字符之间的关系是一对一的关系。

(2)非线性结构:非线性结构是指数据元素之间存在一对多或多对多的关系,数据元素之间可以有多个直接前驱和直接后继

①树:树是由 n(n>=0)个结点组成的有限集合,其中一个结点称为根结点,其余结点可以分为多个互不相交的子集,每个子集本身又是一棵树。树的特点是一个结点可以有多个子节点,但每个结点只能有一个父节点。
②图:图是由顶点的有穷非空集合和顶点之间的边的集合组成。图的特点是顶点之间可以有多个边,边可以有方向。

总的来说,线性结构和非线性结构分为这四类:
在这里插入图片描述
他们本质是这些数据元素之间存在着的不同关系。

存储结构的种类

主要介绍这两种类型:顺序存储结构和链式存储结构。
顺序存储结构和链式存储结构是两种常见的数据结构存储方式。

(1)顺序存储结构:顺序存储结构是将数据元素存储在一块连续的存储空间中。在顺序存储结构中,数据元素的物理存储位置是连续的,可以通过下标或偏移量来直接访问元素。常见的顺序存储结构有数组

优点:
访问速度快:由于元素在内存中连续存储,可以通过下标直接访问,因此访问速度较快。
存储密度高:不需要额外的存储空间来存储指针或链接信息,存储密度高。
缺点:
大小固定:顺序存储结构的大小是固定的,一旦分配了固定大小的空间,无法动态扩展或缩小。
插入和删除操作慢:在顺序存储结构中,插入和删除元素需要移动其他元素,时间复杂度较高。

(2)链式存储结构:链式存储结构是通过节点之间的指针或链接来实现数据元素的存储。在链式存储结构中,每个节点包含数据元素和指向下一个节点的指针。常见的链式存储结构有链表。

优点:
动态存储:链式存储结构可以根据需要动态分配和释放存储空间,可以灵活地增加或删除元素。
插入和删除操作快:在链式存储结构中,插入和删除元素只需要修改指针的指向,时间复杂度较低。
缺点:
访问速度慢:由于节点之间的链接需要通过指针进行跳转,访问元素的速度较慢。
存储密度低:链式存储结构需要额外的指针来存储节点之间的链接信息,存储密度低。

选择顺序存储结构还是链式存储结构取决于具体的应用场景和需求。顺序存储结构适用于对元素的访问频繁,而插入和删除操作较少的情况。链式存储结构适用于需要动态分配和释放存储空间,插入和删除操作较频繁的情况。

这里我用C语言给一个例子:

存储方式:
数组:数组使用一块连续的内存空间来存储元素,元素之间的内存地址是连续的。数组的大小在创建时就确定,且一旦分配了固定大小的空间,大小就无法动态改变。
链表:链表使用节点来存储元素,每个节点包含数据和指向下一个节点的指针。节点在内存中可以是分散的,通过指针将它们链接起来。链表的大小可以动态增加或缩小。

插入和删除操作:
数组:在数组中插入或删除元素时,涉及到元素的移动。插入元素时,需要将插入位置后面的元素向后移动,删除元素时,需要将删除位置后面的元素向前移动。这些操作可能会导致较大的时间复杂度。
链表:在链表中插入或删除元素时,只需要修改节点的指针指向即可,不需要移动其他节点。这些操作时间复杂度较低。

访问元素的效率:
数组:数组通过下标来访问元素,可以直接通过下标计算出元素在内存中的位置。因此,访问数组元素的效率很高。
链表:链表中的节点之间通过指针链接,访问链表元素需要通过指针跳转,因此,相对于数组,访问链表元素的效率较低。

存储密度:
数组:数组在存储元素时不需要额外的指针或链接信息,存储密度高。
链表:链表中每个节点都需要存储指向下一个节点的指针,因此,链表的存储密度较低。

三、算法

1.什么是算法?算法的描述

算法是一组解决问题的明确步骤和指令。它是一种有序的操作序列,用于解决特定问题或完成特定任务。算法可以用来执行各种计算、数据处理和自动化任务。它可以是数学公式、计算机程序、流程图等形式。算法的目标是通过一系列有限的步骤来解决问题,并且在有限的时间内产生正确的结果。算法可以用来解决各种问题,比如排序、搜索、加密、图像处理等。
在这里插入图片描述

2.一个算法要具备的特性

在这里插入图片描述

3.算法设计的要求?

在这里插入图片描述
在这里插入图片描述
高效性和可读性顾名思义,不用再去解释。

四、衡量算法优劣的两个重要特性:时间复杂度和空间复杂度

在这里插入图片描述

1.对于时间复杂度,直接上例子:

在这里插入图片描述
大循环套小循环,每个循环内语句执行次数之和就是时间复杂度。
但是,这样用多项式来表示的话,形式比较复杂,所以不太好。这时候引入无穷小,外面加一个O,作为同阶无穷小。
在这里插入图片描述
也就是说用渐进时间复杂度来度量算法的时间好坏。用其中最多的执行次数的语句的时间作为总体的时间
在这里插入图片描述
那么如何具体的计算一个算法的时间复杂度呢?

例①

在这里插入图片描述
要点:找到算法中执行次数最多的那条语句。
明显,对于其中一个二重循环,最里面的sum【i】+=x[i][j],外循环执行一次,内循环执行n次,外循环执行m次,内循环执行mn次,其他语句最多执行m次,所以时间复杂度为O(mn)。

例二

在这里插入图片描述
最里面循环的执行语句一般次数最多,这里i循环执行一次,j循环执行n次,k循环执行n*n次,则i循环执行n次,k循环执行n^3次,所以时间复杂度为O(n的3次方)。

例三

在这里插入图片描述
采用如图的计算方法,变成一个数学问题来计算:
在这里插入图片描述

例四

在这里插入图片描述
关于伪代码,要找到执行次数x与n的关系。
在这里插入图片描述

2.时间复杂度的其他情况

在这里插入图片描述
对于一个算法,它的执行次数不一定是固定的,那么就会存在最少和最多的执行次数的可能。比如这个例子,要查找数组中的某个元素,那么这个语句的执行次数有可能最好1次就找到了,但是也有可能一直要执行到n次才能找到。
在这里插入图片描述
我们通常只考虑最坏时间复杂度,保证算法的运行时间在一个可控的范围内。
以下是时间复杂度的大小排序:
在这里插入图片描述

3.渐进空间复杂度

在这里插入图片描述
渐进空间复杂度是衡量算法在处理输入规模增大时所需的额外空间的度量。它表示算法所使用的额外空间的增长趋势。

常见的渐进空间复杂度有以下几种:

O(1):常数空间复杂度,表示算法所使用的额外空间是一个常数。不随输入规模的增大而变化。

O(n):线性空间复杂度,表示算法所使用的额外空间随输入规模的增大而线性增长。

O(n^2):平方空间复杂度,表示算法所使用的额外空间随输入规模的增大而平方增长。

O(log n):对数空间复杂度,表示算法所使用的额外空间随输入规模的增大而对数增长。

O(n log n):线性对数空间复杂度,表示算法所使用的额外空间随输入规模的增大而线性对数增长。

需要注意的是,渐进空间复杂度只考虑算法所使用的额外空间,不包括输入数据所占用的空间。在计算渐进空间复杂度时,通常忽略常数因子和低阶项,只关注最高阶项。和时间复杂度类似,渐进空间复杂度也使用大O表示法来表示。

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

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

相关文章

【VR开发】【Unity】【VRTK】1-无代码VRVR开发介绍

本篇开始精简讲解VRTK相关的知识。 VRTK是基于Unity的一套提供无代码VR开发的插件,这套插件开源,可商用,集合了目前可能的VR体验组件,可以让不会C#编程但想要开发VR体验的人在不写一行代码的前提下开发出心仪的VR作品。 这套组件问世后也很受欢迎,目前已经进化到了第四代…

Java 算法篇-深入了解二分查找法

🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 目录 1.0 二分查找法的说明 2.0 二分查找实现的多种版本 2.1 二分查找的基础版本 2.2 二分查找的改动版本 2.3 二分查找的平衡版本 2.4 二分查找的官方版本 3.0 二分查找的应用 1…

【Linux系统学习】系统编程开发工具编译器gcc/g++使用

个人主页点击直达:小白不是程序媛 Linux专栏:Linux系统学习 目录 前言 Linux系统下安装gcc和g gcc和g的不同 gcc/g的使用 gcc/g选项 预处理 头文件的展开 宏替换 注释的删除 条件的编译 编译 汇编 链接 系统库 库的分类 库的安装 库的…

[计算机提升] Windows系统软件:娱乐类

3.3 系统软件:娱乐类 3.3.1 Windows Media Player:dvdplay Windows Media Player是Windows操作系统自带的多媒体播放软件,用于播放和管理电脑中的音频和视频文件。它提供了以下功能: 播放音频和视频文件:Windows Med…

基于ThinkPHP+MySQL实现的通用的PHP网站后台管理系统

caozha-admin 后台管理框架 1.8.3 caozha-admin是一个通用的PHP网站后台管理框架,基于开源的ThinkPHP开发,特点:易上手,零门槛,界面清爽极简,极便于二次开发。 基础功能 1、系统设置 2、管理员管理 3、…

搭建ELK+Filebead+zookeeper+kafka实验

一、ELKFilebeatkafkazookeeper架构 架构图分别演示 第一层:数据采集层 数据采集层位于最左边的业务服务集群上,在每个业务服务器上面安装了filebead做日志收集,然后把采集到的原始日志发送到kafkazookeeper集群上。 第二层:消…

vue3中,使用html2canvas截图包含视频、图片、文字的区域

需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 npm install html2canvas第二步,在页面引入: import html2canvas from html2canvas;第三步,页面使用: 1&…

SpringCloudGateway--过滤器(自定义filter)

目录 一、概览 二、通过GatewayFilter实现 三、继承AbstractGatewayFilterFactory 一、概览 当使用Spring Cloud Gateway构建API网关时,可以利用Spring Cloud Gateway提供的内置过滤器(filter)来实现对请求的处理和响应的处理。过滤器可以…

TiDB 企业版全新升级,平凯数据库核心特性全解读

作为 TiDB 企业版的全新升级,平凯数据库一经推出便广受媒体及用户关注。 近日,平凯星辰首席科学家丁岩在“平凯数据库全解读”活动中,首次详细介绍了平凯数据库的核心能力。 本文为丁岩演讲实录全文,为方便阅读,已做部…

物联网AI MicroPython传感器学习 之 QMC5883指南针罗盘传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 QMC5883是一款表面贴装的集成了信号处理电路的三轴磁性传感器,应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 引脚定义 VCC:3V3&#…

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试:开源项目 开源项目完整代码及基础教程: https://mbd.pub/o/bread/ZZWclp5x CNN模型: 1.导入必要的库和模块&…

数据结构与算法:使用数组模拟环形队列Java版

文章目录 如何使用数组模拟队列环形队列逻辑分析自己写的听课笔记实现代码部分方法说明 如何使用数组模拟队列 不知道如何使用数组模拟队列的可以看上一篇文章 使用数组模拟队列点击跳转 环形队列逻辑分析 自己写的听课笔记 实现代码 package com.haimeng.queue;import java…

uniapp-自定义表格,右边操作栏固定

uniapp-自定义表格,右边操作栏固定 在网上找了一些,没找到特别合适的,收集了一下其他人的思路,基本都是让左边可以滚动,右边定位,自己也尝试写了一下,有点样式上的小bug,还在尝试修…

多线程锁的升级原理是什么

在 Java 中,锁共有 4 种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。 多线程锁锁升级过程 如下图所示 多线程锁的升级过程…

在NISQ小型计算机上执行大型并行量子计算的可能性

简介 Steve White提出了密度矩阵重整化群(DMRG)的基本思想,即纠缠是一种有价值的资源,可以用来精确或近似地描述大量子系统。后来,这一思想被理解为优化矩阵积状态(MPS)的算法,支持…

Android开发笔记(三)—Activity篇

活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 (1)从当前页面跳到新页…

[idea]关于idea开发乱码的配置

在JAVA开发中,一般统一设置为UTF-8的编码,包括但不限于开发工具、日志架构、虚拟机、文件编码等。常见配置如下: 1、IDEA工具 在idea64.exe.vmoptions、idea.exe.vmoptions中添加: -Dfile.encodingUTF-8 2、JAVA 运行在window…

python科研绘图:条形图

条形图(bar chart)是一种以条形或柱状排列数据的图形表示形式,可以显示各项目之间的比较。它通常用于展示不同类别的数据,例如在分类问题中的不同类别、不同产品或不同年份的销售数据等。 条形图中的每个条形代表一个类别或一个数…

区块链与教育:颠覆传统,引领未来

区块链与教育:颠覆传统,引领未来 摘要:本文将探讨区块链技术在教育领域的应用及其潜在影响。通过介绍区块链技术的基本原理、教育领域的现状,以及区块链技术在教育中的实际应用案例,我们将展望一个去中心化、安全可信…

软件测试面试高频30道面试题

如果哪个测试经理在看我的文章,希望对面试者要微笑,不然面试结束,出门之后就一万个草泥马奔腾而过,其实面试者并不是希望你给他们什么,而是一种尊重,平等的谈话,不要高高在上感觉自己超牛逼一样…