绪论

知识结构:


一、什么是数据结构

例1:电话号码薄的查询问题。

(a1,b1),(a2,b2),…,(an,bn)(a_1,b_1),(a_2,b_2),\dots,(a_n,b_n) (a1​,b1​),(a2​,b2​),…,(an​,bn​)

aia_iai​:表示姓名,bib_ibi​:表示电话号码,i=1,2,…,ni=1,2,\dots,ni=1,2,…,n。

思考:

  • 怎样组织数据?
  • 怎样存储数据?
  • 怎样操作数据?
    • 添加操作
    • 删除操作
    • 修改操作
    • 查询操作
    • 排序操作
  • 怎样代码实现?

例2:学生自然情况查询问题。

思考:

  • 怎样组织数据?
  • 怎样存储数据?
  • 怎样操作数据?
    • 添加操作
    • 删除操作
    • 修改操作
    • 查询操作
    • 排序操作
  • 怎样代码实现?

数据结构的定义(Data Structure)

语言描述:数据结构是研究数据的逻辑结构,存储结构(物理结构)以及它们之间的关系,并对这种结构定义相适应的运算,设计出相应的算法。

形式化描述:数据结构是一个二元组

Data_Struct=(D,R)Data\_Struct=(D,R) Data_Struct=(D,R)

其中,DDD:是数据元素的有限集合, RRR:是DDD上关系的有限集合。

例3:集合结构。

Set=(D,R)Set=(D,R)Set=(D,R) 其中,D={item1,item2,item3,item4,itme5}D=\lbrace item_1,item_2,item_3,item_4,itme_5 \rbraceD={item1​,item2​,item3​,item4​,itme5​},R={}R=\lbrace \rbraceR={} (元素之间没有关系)。

比如:

  • Python语言中的 Set
  • C#语言中的 HashSet

例4:线性结构。

Line=(D,R)Line=(D,R)Line=(D,R)其中,R={<itme5,item1>,<item1,item3>,<item3,item4>,<item4,item2>}R=\lbrace <itme_5,item_1>,<item_1,item_3>,<item_3,item_4>,<item_4,item_2> \rbraceR={<itme5​,item1​>,<item1​,item3​>,<item3​,item4​>,<item4​,item2​>}(除了首尾结点,其余结点只有一个直接前驱,一个直接后继)。

比如:

  • Numpy 中的ndarray
  • C#语言中的数组
  • Matlab中的矩阵

二、基本概念与术语

1、数据(Data)

指所有能输入计算机中并被计算机程序处理的符号集合。

可以是数值数据,如整数、实数;也可以是非数值数据,如字符、文字、图形、声音等。

2、数据元素(Data Element)

数据的基本单位,也称为结点,顶点,记录。

在计算机程序中,通常被作为一个整体进行考虑和处理。

3、数据项(Data Item)

具有独立含义的最小标识单位,也称为字段(Field)。

例如:在数据库信息处理系统中,数据表中的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月、成绩等字段就是数据项。

可见:数据由数据元素组成,数据元素由数据项组成。

4、逻辑结构(Logic Structure)

对数据之间逻辑关系的描述。(独立于计算机)

5、存储结构(Storage Structure)

逻辑结构在计算机存储器中的实现,即数据在计算机中的存放方式。

  • 顺序:利用数组对数据进行存储。
  • 链式:利用指针对数据进行存储。
  • 索引:利用索引表来定位数据的存储。
  • 散列:利用散列函数,根据数据元素关键字来定位数据的存储。

6、数据类型(Data Type)

数据类型是数据的取值范围和对数据进行操作的总和。

如:int、long、float、double、bool、char等

7、抽象数据类型(Abstract Data Type)

抽象数据类型由一组数据以及在该组数据上的一组操作组成。

抽象数据类型的格式定义如下:

ADT Name isData构成该抽象数据类型所必须的基本数据项OperationsConstructorInitial Values:赋给基本数据项的值Press:初始化对象Operation1Input:操作1要求用户输入的值PreCondition:系统执行操作1前的数据状态Press:操作1的解释说明Output:操作1结束后返回的数据PostCondition:系统执行操作1后的数据状态Operation2… …OperationN… …
End ADT Name

例5:矩形结构的ADT描述。

ADT Rectangle isDatafloat Lengthfloat WidthOperationsConstructorInitial Values:构造矩形时,赋长和宽的值。Press:初始化对象,给矩形的长和宽赋值。SetLengthInput:赋给变量Length的新值PreCondition:无Press:将矩形的长度值修改为新值Output:无PostCondition:矩形的长度值被修改SetWidthInput:赋给变量Width的新值PreCondition:无Press:将矩形宽度值修改为新值Output:无PostCondition:矩形的宽度值被修改GetAreaInput:无PreCondition:矩形的长度和宽度都大于零Press:得到矩形的面积Output:返回矩形面积的值PostCondition:无GetPerimeterInput:无PreCondition:矩形的长度和宽度都大于零Press:得到矩形的周长Output:返回矩形的周长PostCondition:无
End ADT Rectangle

一旦定义了矩形结构的ADT描述,就可以用代码进行实现了。

public class Rectangle
{public float Length;public float Width;public Rectangle(float length, float width){Length = length > 0 ? length : 0f;Width = width > 0 ? width : 0f;}public void SetLength(float length){Length = length > 0 ? length : 0f;}public void SetWidth(float width){Width = width > 0 ? width : 0f;}public float GetArea(){if (Length * Width == 0)throw new ArgumentOutOfRangeException("长度或宽度为零。");return Length * Width;}public float GetPerimeter(){if (Length * Width == 0)throw new ArgumentOutOfRangeException("长度或宽度为零。");return (Length + Width) * 2;}
}

三、算法与算法分析

1、算法的基本概念

1.1 算法的定义

为了解决某类特定问题而提出的一组有穷规则,即以某些值或值的集合为输入并产生某些值或值的集合为输出的一系列运算步骤。

1.2 算法的五个重要特性

  • 有穷性(Finity):经过有限的时间可以完成。
  • 确定性或无二义性(Unambiguousness):给相同的输入,即得到相同的输出。
  • 可行性(Realizability)
  • 输入(Input):至少有0个输入。
  • 输出(Output):至少1个。

1.3 算法设计的五点要求

  • 正确性(Correctness)
  • 可读性(Readability)
  • 健壮性(Robustness):具有很强的容错能力,对边界情况和异常情况做出处理。
  • 运行时间(Running Time)
  • 占用空间(Storage Space):完成功能的前提下,时间越少,空间越小,越好。

1.4 算法与程序的区别

  • 表现形式不同

    • 算法:自然语言、伪计算机语言等
    • 程序:计算机语言
  • 是否具备有穷性

2、算法分析

2.1 时间复杂度(Time Complexity)

1)算法耗费的时间

一个算法耗费的时间 = 算法中每条语句的执行时间之和

每条语句的执行时间 = 语句的执行次数×\times×语句执行一次所需的时间

一般认为每条语句执行一次所需的时间是单位时间,即:一个算法耗费的时间 = 所有语句的执行频数之和

例6:计算方阵An×n×Bn×nA_{n\times n}\times B_{n \times n}An×n​×Bn×n​ 算法耗费的时间。

static double[,] MatrixMultiply(double[,] A, double[,] B, uint n)
{double[,] C = new double[n, n];             // 1for (int i = 0; i < n; i++)                 // n+1{for (int j = 0; j < n; j++)             // n*(n+1){C[i, j] = 0;                        // n*nfor (int k = 0; k < n; k++)         // n*n*(n+1){C[i, j] += A[i, k] * B[k, j];   // n*n*n}}}return C;                                   // 1
}

T(n)=2n3+3n2+2n+3T(n)=2n^3+3n^2+2n+3T(n)=2n3+3n2+2n+3

2)问题的规模

算法求解问题的输入量,一般用一个整数表示。

  • 矩阵求解问题,矩阵的阶数。
  • 图论问题,图的结点个数,边的条数。

3)算法的时间复杂度 T(n)T(n)T(n)

就是该算法的时间耗费,是关于问题规模nnn的函数。

当n→∞n\to\inftyn→∞时,与T(n)T(n)T(n)的同阶的简单函数称为算法的渐进时间复杂度。

例7: T(n)=2n3+3n2+2n+3T(n)=2n^3+3n^2+2n+3T(n)=2n3+3n2+2n+3

lim⁡n→∞2n3+3n2+2n+3n3=2\displaystyle \lim_{n \to \infty}{\frac{2n^3+3n^2+2n+3} {n^3}=2}n→∞lim​n32n3+3n2+2n+3​=2

所以 T(n)=O(n3)T(n)=O(n^3)T(n)=O(n3)

例8:针对一个问题,设计算法A1A_1A1​,A2A_2A2​其耗费时间T1(n)=100n2T_1(n)=100n^2T1​(n)=100n2,T2(n)=n3+n+1T_2(n)=n^3+n+1T2​(n)=n3+n+1,当n→∞n\to\inftyn→∞时,T1(n)=O(n2)T_1(n)=O(n^2)T1​(n)=O(n2),T2(n)=O(n3)T_2(n)=O(n^3)T2​(n)=O(n3),即算法A1A_1A1​所耗费的时间远小于算法A2A_2A2​,在宏观上可通过渐进时间复杂度表示算法的优劣。

一般,我们把渐进时间复杂度T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n))简称为时间复杂度。f(n)f(n)f(n)表示算法中频数最大语句的频数。

例9:

int x = 0;
int y = 0;
for (int i = 0; i < n; i++)x++;
for (int j = 0; j < n; j++)for (int k = 0; k < n; k++)y++;

T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)

例10:

int i = 50;
int j = 60;
int temp = i;
i = j;
j = temp;

T(n)=O(1)T(n)=O(1)T(n)=O(1)

4)常见的时间复杂度

  • 常数阶:O(1)O(1)O(1)
  • 对数阶:O(log(n))O(log(n))O(log(n))
  • 线性阶:O(n)O(n)O(n)
  • 线性对数阶:O(nlog(n))O(nlog(n))O(nlog(n))
  • 平方阶:O(n2)O(n^2)O(n2)
  • 立方阶:O(n3)O(n^3)O(n3)
  • kkk方阶:O(nk)O(n^k)O(nk)
  • 指数阶:O(2n)O(2^n)O(2n)

5)最坏时间复杂度

例11:在数组A[n]中查找给定值k

static int Find(int[] A, int k)
{int i;for (i = 0; i < A.Length; i++) //(#)if (A[i] == k)break;return i == A.Length ? -1 : i;
}
  • A中没有与k相等的元素,则(#)的频数f(n)=n+1f(n)=n+1f(n)=n+1;
  • A中第1个元素与k相等,则(#)的频数f(n)=1f(n)=1f(n)=1;

最坏时间复杂度:最坏情况下的时间复杂度。

一般不特别说明,所讨论的时间复杂度,都指最坏时间复杂度。

2.2 空间复杂度(Space Complexity)

指该算法所耗费的存储空间,也是问题规模nnn的函数,渐进空间复杂度也常常称为空间复杂度。


后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:



数据结构与算法:01 绪论相关推荐

  1. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  2. 【数据结构-ZZU】01. 绪论

    一.绪论 1. 理解数据元素.数据结构.数据的逻辑结构与物理结构.逻辑结构与物理结构间的关系. 基本概念: 数据结构:指相互之间存在一种或多种特定关系的数据元素的集合.(数据结构就是研究数据的逻辑结构 ...

  3. 数据结构与算法01:一张图概括【数据结构】是什么?(大白话+图解)

    大白话+图解,数据结构到底是什么? 数据结构:数据结构(data structure)描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构.数据的存储结构和数据的运算. ...

  4. DAY 21冲击蓝桥杯——Python数据结构与算法01 时间复杂度

    是指算法的执行效率 算法的执行时间与算法的输入值之间的关系 for/while循环 O(n) 无循环 则为常量O(1) 常见时间复杂度案例分析: O(1): def O1(num):i=numj=nu ...

  5. 数据结构和算法———P1 绪论

    逻辑结构 集合结构 线性结构 树形结构 图形结构 物理结构 顺序存储 链式存储 – 内容+指针 – 指针指向下一个地址

  6. 数据结构与算法基础01:绪论

    目录 1. 程序设计 = 数据结构 + 算法 2. 基本概念和术语 2.1 数据 2.2 数据元素 2.3 数据对象 2.4 数据结构 3. 逻辑结构和物理结构 3.1 逻辑结构 3.2 物理结构(存 ...

  7. 数据结构与算法 --- 第一章 绪论

    数据结构与算法 第一章 绪论 1. 作者的话 2. 为什么要学习数据结构与算法 3. 数据结构与算法的作用 4. 数据结构的概念 4.1 名词解读 4.2 什么是数据 4.3 数据结构 4.4 逻辑结 ...

  8. 数据结构和算法_零基础入门01

    数据结构和算法_零基础入门01 一.数据结构是什么? 逻辑结构.物理结构 二.算法 算法的五个基本特征 算法设计的要求 b站学习小甲鱼的数据结构与算法,自留笔记. 程序设计=数据结构+算法 一.数据结 ...

  9. 尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组

    数据结构与算法的关系 几个实际编程中遇到的问题 要想写出优秀的算法,首先应该能读懂别人写好的算法. 将生活中遇到的实际问题,使用程序来解决 线性结构和非线性结构 线性结构和非线性结构的关系: 数据结构 ...

  10. 尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业01

    尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业第一题 要求: 1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data 2) 恢复原来的数组时,读取map.data进行恢复 ...

最新文章

  1. Oracle取最大/最小值函数
  2. 详解TCP协议的服务特点以及连接建立与终止的过程(俗称三次握手四次挥手)
  3. dubbo web工程示例_分布式开发-Zooker+dubbo入门-Demo
  4. win10关机后自动重启_安卓手机重启和关机后再开机,区别原来这么大!别不当回事...
  5. jQuery学习之二---jq核心
  6. java eml解析_javamail 收邮件 解析eml文件
  7. 在线等:“手里 5 个 offer,优选头条还是阿里?”
  8. Linux 到 Windows scp 复制速度慢
  9. 从0开始学Swift笔记整理(五)
  10. python dict setdefault_Python dict setdefault()用法及代码示例
  11. delete了,析构函数却没有调用
  12. 粒子滤波算法matlab代码,粒子滤波算法原理及Matlab程序(专题).ppt
  13. 嵌入式linux系统蜂鸣器实验,嵌入式系统原理实验四蜂鸣器.docx
  14. 使用Whisper框架快速为项目添加国际化支持
  15. 全景视频预测头部移动-Predicting Head Movement in Panoramic Video: A Deep Reinforcement Learning Approach
  16. mysql8 Record Locks ,Gap Locks, Next-Key Locks实验2 唯一索引和非唯一索引,无索引情况
  17. python图像去污_图像去雾毕业论文准备02-python中os标准库
  18. Linux中断子系统(一)中断控制器GIC架构
  19. Java调用被子类重写的方法
  20. Java设计模式8,校验、审批流程改善神器,责任链模式

热门文章

  1. (已解决)ubuntu20.04 jar xvf XXX.zip报错-java.io.EOFException:Unexpected end of ZLIB input stream
  2. 人工神经网络是如何实现存算一体的
  3. linux命令行3d,Linux命令行快捷键
  4. 【软件测试培训】了解jmeter分布式测试
  5. 直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突
  6. Excel VBA 教程
  7. XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
  8. 71 mac boook pro 无 gpu 下caffe 安装
  9. swift集成alamofire的简单封装
  10. 求教关于NFS服务器的防火墙的设置