数据结构基础知识、名词概述

    • 1.1 基本概念和术语
      • 1.1.1 数据、 数据元素、 数据项和数据对象
      • 1.1.2 数据结构
      • 1.1.3 数据类型和抽象数据类型
    • 1.2 抽象数据类型的表示与实现
    • 1.3 算法与算法分析(1)
    • 1.4 算法与算法分析(2)
    • 1.5 算法与算法分析(3)
    • 1.6 算法与算法分析(4)

整体知识框架

image-20230721101102611

1.1 基本概念和术语

image-20230718220144794

1.1.1 数据、 数据元素、 数据项和数据对象

数据 (Data) 是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号 的总称。如数学计算中用到的整数和实数,文本编辑中用到的字符串,多媒体程序处理的图形、 图像、声音及动画等通过特殊编码定义后的数据。

数据元素(Data Element)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。 在有些情况下,数据元素也称为元素、记录等。

数据元素用于完整地描述一个对象,如图中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。

image-20230717220507287

数据项 (Data Item) 是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生 基本信息表中的学号、姓名、性别等都是数据项。

image-20230717220620660

数据对象 (Data Object) 是性质相同的数据元素的集合,是数据的一个子集。

image-20230717220717463

数据元素与数据对象的区别

image-20230717220812856

1.1.2 数据结构

数据结构 (Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合。换句话 说,数据结构是带 “结构” 的数据元素的集合, “结构” 就是指数据元素之间存在的关系

数据结构包括逻辑结构存储结构两个层次。

1、数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或存储结构

2、数据元素之间的逻辑关系,称为逻辑结构

image-20230717221408015

逻辑结构和存储结构之间的关系是:逻辑结构定义了数据之间的逻辑关系,而存储结构则实现了这种逻辑关系在内存中的存储方式。

逻辑结构的种类

划分方法一

image-20230717223917738

划分方式二

(1) 集合结构

数据元素之间除了 “属于同一集合” 的关系外,别无其他关系。例如,确定一名学生是否为 班级成员, 只需将班级看做一个集合结构。

(2) 线性结构

数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进 行排列,将组成一个线性结构。

(3) 树结构

数据元素之间存在一对多的关系。例如,在班级的管理体系中,班长管理多个组长,每位组 长管理多名组员,从而构成树形结构。

(4) 图结构或网状结构

数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系, 任何两位同学都可以是 朋友,从而构成图状结构或网状结构。

image-20230717224115191

存储结构的种类

(1)顺序存储结构

用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示. 比如:数组

(2)链接存储结构

用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示, 每一个元素不仅存储它本身的数据,还要存储下一个元素的地址, 例如:链表

image-20230717224638473

(3)索引存储结构

在存储节点信息的同时,还建立附加的索引表。索引表中的每一项称为一个索引项,一般形式为:(关键字,地址)

(4)散列存储

根据节点的关键字直接计算出该节点的地址

image-20230717224923808

1.1.3 数据类型和抽象数据类型

**数据类型 (Data Type) **

在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量常量或表达式,明确说明它们所属的数据类型

例如: Java语言中的 int、long、short等八种基本数据类型

而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。

类型明显或隐含地规定了数 据的取值范围、存储方式以及允许进行的运算,数据类型是一个值的集合和定义在这个值集上的 一组操作的总称.

例如: int类型代表整数,其范围 -2,147,483,648到2,147,483,647

image-20230718213804980

抽象数据类型(Abstract Data Type, ADT)

抽象数据类型 (Abstract Data Type, ADT) 一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象数据对象上关系的集合 以及对数据对象的基本操作的集合

ADT抽象数据类型名(数据对象:(数据对象的定义〉数据关系:(数据关系的定义〉基本操作:(基本操作的定义〉
}ADT抽象数据类型名

其中,数据对象和数据关系的定义采用数学符号和自然语言描述,基本操作的定义格式为

基本操作名(参数表)初始条件:(初始条件描述〉操作结果:(操作结果描述〉

基本操作有两种参数: '赋值参数只为操作提供输入值;引用参数 以 “&” ·打头,除可提供输 入值外,还将返回操作结果。

“初始条件” 描述了操作执行之前数据结构和参数应满足的条件,若 初始条件 为空,则省略。

“操作结果” 说明了操作正常完成之后,数据结构的变化状况和应返回的结果。

1.2 抽象数据类型的表示与实现

使用 Java 实现抽象数据类型 “复数” 的实现:

public class ComplexNumber {private double real; // 实部private double imaginary; // 虚部// 构造函数public ComplexNumber(double real, double imaginary) {this.real = real;this.imaginary = imaginary;}// 获取实部public double getReal() {return real;}// 获取虚部public double getImaginary() {return imaginary;}// 加法public ComplexNumber add(ComplexNumber other) {double newReal = this.real + other.real;double newImaginary = this.imaginary + other.imaginary;return new ComplexNumber(newReal, newImaginary);}// 减法public ComplexNumber subtract(ComplexNumber other) {double newReal = this.real - other.real;double newImaginary = this.imaginary - other.imaginary;return new ComplexNumber(newReal, newImaginary);}// 乘法public ComplexNumber multiply(ComplexNumber other) {double newReal = this.real * other.real - this.imaginary * other.imaginary;double newImaginary = this.real * other.imaginary + this.imaginary * other.real;return new ComplexNumber(newReal, newImaginary);}// 转换为字符串形式@Overridepublic String toString() {if (imaginary >= 0) {return real + " + " + imaginary + "i";} else {// 数学函数,取绝对值return real + " - " + Math.abs(imaginary) + "i";}}
}

1.3 算法与算法分析(1)

算法的定义

算法 (Algorithm) 是为了解决某类问题而规定的一个有限长的操作序列。

算法的描述

  • 自然语言:英语、中文
  • 流程图:传统流程图、NS流程图
  • 伪代码:类语言:类C语言
  • 程序代码:C、Java

算法与程序

  • 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出一个问题可以有多种算法
  • 程序是用某种程序设计语言对算法的具体实现。

image-20230718222312452

算法的特性

(1)有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。【比如:不能陷入死循环

(2) 确定性。对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性, 使算法的执行者或阅读者都能明确其含义及如何执行。【比如对于同一个输入而出现不同的结果,这就是不确定性

(3) 可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。

(4) 输入。一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的, 在它们被调用时,从主调函数获得输入值。

(5) 输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的 算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。

算法设计的要求

  • 正确性

image-20230718223040994

  • 可读性

image-20230718222821676

  • 健壮性

image-20230718222912525

  • 高效性

image-20230718223029848

1.4 算法与算法分析(2)

通常来说一个问题,往往有好几种算法可以实现,我们如何区分算法的好坏、优劣。

那么好的算法首先应该具备正确性,然后是健壮性、可读性。在几个方面都满足的情况下,主要考虑算法的效率, 通过算法效率的高度评判不同算法的优劣程度。

算法效率通常考虑以下俩个方面:

  1. 时间效率:指的是算法所耗费的时间
  2. 空间效率:指的是算法执行过程中所耗费的存储空间

这俩者之前往往是矛盾的,鱼和熊掌不可兼得~

算法时间效率的度量

算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。

俩种度量方法:

  • 事后统计:将算法实现,实际测算其时间和空间的开销
  • 事前分析:对算法的一种估算方法(一般采用此方法
    • 算法运行时间 = 一个简单操作所需的时间*简单操作次数

image-20230718224312440

等价于

image-20230718224534616

每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度以及编译的代码质量。是由机器本身软硬件环境决定的它与算法无关。

所以,我们可假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了。

例如:俩个 n*n 矩阵相乘的算法可描述为:

image-20230718225015053

我们把算法所消耗的时间定义为 该算法中每条语句的频度之和,则上述算法的时间消耗 Tn为:

image-20230718225209299

以上这种方式进行统计太麻烦,为了方便比较不同算法的时间效率,仅仅比较他们之间的数量级。

若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作**T(n)=O(f(n))**称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度

对于上面矩阵问题的,消耗的时间为:

image-20230718230208080

n -> ∞ ∞ 时,T (n)/n3 = 2,这表示n充分大时,T(n)与n3是同阶或同数量级,引入大“O”记号,则T(n)可记作:

image-20230718230347218

因此,在我们求时间复杂度的时候,只需要找到算法中基本语句重复执行的次数

什么是基本语句

  • 算法中重复执行次数和算法的执行时间成正比的语句
  • 对算法运行时间的贡献最大
  • 执行次数最多

基本语句的重复次数(时间复杂度)问题规模n的某个函数f(n),算法的时间量度即为: T(n) = O(f(n))

  • n越大算法的执行时间越长
  • 排序: n为记录数
  • 矩阵:n为短阵的阶数
  • 多项式: n为多项式的项数
  • 集合:n为元素个数
  • 树: n为树的结点个数
  • 图: n为图的顶点数或边数

1.5 算法与算法分析(3)

分析算法事件复杂度的基本方法

image-20230719101854548

忽略是所有低次幂项最高次幂系数,体现出增长率的含义。

步骤

  1. 找出语句频度最大的那条语句作为基本语句(执行次数最多的语句)

  2. 计算基本语句的频度得到问题规模 n 的某个函数fn

  3. 取其数量级用符号“O”表示

举例:

x = 0: V =0
for ( int k = 0; k < n; k ++)X ++·
for ( int i = 0;i < n;i++ )for ( int j = 0;j < n;j++ )y + +

找出语句频度最大的: 第一个for循环频度为:n+1,第二个for循环为 n+1,第三层循环为 n * (n+1) 【条件判断也看做是一次执行次数】

T n = O ( n ∗ ( n + 1 ) ) Tn = O( n*(n+1)) Tn=O(n(n+1))

忽略最高次幂项系数、低次幂项,最终:Tn = O( n2)

举例:

分析以下时间复杂度

i = 1;1while(i<=n)i=i*2;2

若循环执行1次: i=1*2=2

若循环执行2次: i=2*2=22

若循环执行3次: i=2*2=23

若循环执行x次: i =2x

设语句(2)执行次数为x次,由循环条件 i<= n, 推出 2x< =n x<=log2n

image-20230719104635494

即 f(n) <=log2n , 取最大值 f(n) = log2n

因此该程序段的时间复杂度 Tn = O( log2n) = O( lgn)

1.6 算法与算法分析(4)

前面介绍了如何计算时间复杂度,但是在有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同

image-20230719110018665

最好情况:1次
最坏情况: n
平均时间复杂度为/O(n)


最坏时间复杂度: 指在最坏情况下,算法的时间复杂度

平均时间复杂度: 指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度: 指在最好情况下,算法的时间复杂度

  • 一般情况下是考虑最坏时间复杂度,以保证算法的运行时间最坏不会比它更长

对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度。

image-20230719110612844

算法时间效率的比较

当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊

image-20230719110936940

image-20230719111017900

尽量设计复杂度低的算法:

image-20230719111034662


渐进空间复杂度

空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n)),其中 n 为问题的规模

算法要占用的空间包括

  • 算法本身占据的空间、输入、输出、指令、变量、常数等
  • 算法使用的辅助空间

例子: 将一维数组a中的n个数逆序存放到原数组中。

image-20230719112106468

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

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

相关文章

pytest 自定义HOOK函数

除了系统提过的HOOK函数外&#xff0c;也可以通过自定义HOOK的方式实现想要的功能。 首先创建一个py文件&#xff0c;里面定义自己的HOOK函数&#xff0c;主要pytest里面的hook函数必须以pytest开头。 #myhook.pydef pytest_myhook(user):"""自定义HOOK函数&q…

LeetCode[面试题04.08]首个共同祖先

难度&#xff1a;Medium 题目&#xff1a; 设计并实现一个算法&#xff0c;找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意&#xff1a;这不一定是二叉搜索树。 例如&#xff0c;给定如下二叉树: root [3,5,1,6,2,0,8,null,null,7,…

51单片机--AD/DA

AD/DA介绍 AD和DA是模拟信号和数字信号之间的转换过程。 AD&#xff0c;全称为模拟到数字&#xff08;Analog-to-Digital&#xff09;&#xff0c;指的是将模拟信号转换为数字信号的过程。在AD转换中&#xff0c;模拟信号经过采样、量化和编码等步骤&#xff0c;被转换为离散的…

C语言基础入门详解三

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、C语言之函数指针 #include<stdio.h> #include<stdlib.h> /**函数指针 …

百度文心一言接入教程-Java版

原文链接 前言 前段时间由于种种原因我的AI BOT网站停运了数天&#xff0c;后来申请了百度的文心一言和阿里的通义千问开放接口&#xff0c;文心一言的接口很快就通过了&#xff0c;但是文心一言至今杳无音讯。文心一言通过审之后&#xff0c;很快将AI BOT的AI能力接入了文心…

uniapp使用echarts

uniapp使用echarts 1.下载资源包2.引入资源包3.代码示例注意事项 1.下载资源包 https://echarts.apache.org/zh/download.html 2.引入资源包 将资源包放入项目内 3.代码示例 <template><div style"width:100%;height:500rpx" id"line" ref&…

【网络】应用层——HTTP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; &#x1f3c0;认识HTTP协议 上篇文章中&#xff0c;本喵带着大家对HTTP有了一个初步的认识&#xff0…

使用Django自带的后台管理系统进行数据库管理的实例

Django自带的后台管理系统主要用来对数据库进行操作和管理。它是Django框架的一个强大功能&#xff0c;可以让你快速创建一个管理界面&#xff0c;用于管理你的应用程序的数据模型。 使用Django后台管理系统&#xff0c;你可以轻松地进行以下操作&#xff1a; 数据库管理&…

动态SQL 语句-更复杂的查询业务需求也能轻松拿捏

文章目录 动态SQL 语句-更复杂的查询业务需求动态SQL-官方文档为什么需要动态SQL动态SQL-基本介绍基本介绍动态SQL 必要性解决方案分析 动态SQL 常用标签动态SQL-案例演示if 标签应用实例where 标签应用实例choose/when/otherwise 应用实例forEach 标签应用实例trim 标签应用实…

【公益】Q学友联合福田人力资源局开展“侨香社区促就业 技能培训强本领”

落实《“十四五”就业促进规划》文件精神&#xff0c;进一步提高就业劳动者就业技能水平&#xff0c;提高居民就业率&#xff0c;侨香社区党委坚持以党建为引领&#xff0c;整合多方资源&#xff0c;深入开展“我为群众办实事”&#xff0c;切合群众实际、满足群众需求&#xf…

深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法,大家都知道深度学习模型训练过程是个复杂的过程,这个过程包括数据的收集,数据的处理,模型的搭建,优化器的选择,损失函数的选择,模型训练,模型评估等步骤,其中缺少…

Java基础_网络编程

Java基础_网络编程 网络编程三要素InetAddress网络模型 UDP通信程序单播发送数据接收数据聊天室 组播广播 TCPTCP通信程序三次握手和四次挥手 来源Gitee地址 网络编程三要素 IP: 设备在网络中的地址&#xff0c;是唯一的标识端口号: 应用程序在设备中唯一的标识。协议: 数据在…

【Qt】利用Tool Button控件创建下拉菜单按钮

功能描述 利用qt进行界面设计和开发&#xff0c;创建下拉按钮。 详细实现 1、在qt侧工具栏利用设计打开.ui文件 2、创建按钮 创建一个Tool Button按钮&#xff0c;并在属性窗口中的QToolButton栏中选中MenuButtonPopup属性。 3、创建action 在Action编辑器创建对应的ac…

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作&#xff0c;整理到了语雀上&#xff0c;也顺便发在博客上了。SQL编译优化理论并不复杂&#xff0c;只需要掌握一些关系代数的基础就比较好理解&#xff1b;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…

k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理

k8s webhook实例&#xff0c;java springboot程序实现 对Pod创建请求添加边车容器 &#xff0c;模拟istio实现日志文件清理 大纲 背景与原理实现流程开发部署my-docker-demo-sp-user服务模拟业务项目开发部署my-sidecar服务模拟边车程序开发部署服务my-docker-demo-k8s-opera…

零拷贝原来这么简单!

我们总会在各种地方看到零拷贝&#xff0c;那零拷贝到底是个什么东西。 接下来&#xff0c;让我们来理一理啊。 拷贝说的是计算机里的 I/O 操作&#xff0c;也就是数据的读写操作。计算机可是一个复杂的家伙&#xff0c;包括软件和硬件两大部分&#xff0c;软件主要指操作系统…

uniapp h5 竖向的swiper内嵌视频实现抖音短视频垂直切换,丝滑切换视频效果,无限数据加载不卡顿

一、项目背景&#xff1a;实现仿抖音短视频全屏视频播放、点赞、评论、上下切换视频、视频播放暂停、分页加载、上拉加载下一页、下拉加载上一页等功能。。。 二、前言&#xff1a;博主一开始一直想实现类似抖音进入页面自动播放当前视频&#xff0c;上下滑动切换之后播放当前…

excel要如何自动累加某个单元格上方的所有单元格?

输入公式 SUM(INDIRECT("A1:A"&ROW()-1)) 运行实例如下图 注意图中b4&#xff0c;和b5单元格都输入相同的公式。 此方法可以避免写vba&#xff0c;以前此类问题的解决都是通过vba代码进行处理 对函数进行解析 主要使用了 INDIRECT() 2、公式说明&#xff1a;…

Leetcode | Binary search | 22. 74. 162. 33. 34. 153.

22. Generate Parentheses 要意识到只要还有左括号&#xff0c;就可以放到path里。只要右括号数量小于左括号&#xff0c;也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index&#xff0c;并且每次只需要 …

打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取&#xff1a;winformDemo.rar 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限&#xff0c;如有错误&#xff0c;望指正。 为了简单起见&#xff0c;纸张大小&#xff0c;打印机等信息按照默认的来&#xff0c;本文的实现方案是&#xff1a;打印Pa…