目录
这一篇博文主要是介绍数据结构中的一些基础入门概念,不会涉及到具体的数据结构的解析。适用于第一次接触,或者刚接触数据结构的同学阅读!如果您是一位精通数据结构的大佬,欢迎在评论区指正不足,我会加以改进!!!😝😝😝
一、数据结构的基本概念:
1.数据结构:
数据(data)是信息的载体,在计算机科学中是指所有能输入到计算机中并能被计算机程序识别和处理的符号集合。可以将数据分为两大类:一类是整数、实数等数字数据;一类是文字、声音、图像等非数值数据。
数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。构成数据元素的不可分割的最小单位称为数据项(data item)。由于单独的数据项没有完整的信息意义,所以计算机程序处理数据时,一般是针对数据元素!
数据结构(data structure)是指相互之间存在一定关系的数据元素的集合。数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。数据结构分为逻辑结构和存储结构。
逻辑结构:
数据的逻辑结构(logical structure)是指数据元素之间逻辑关系的整体。根据数据的逻辑关系不同,数据结构分为四个类别:
- 集合:数据元素之间就是属于同一个集合外,没有任何关系。
- 线性结构:数据元素之间存在着一对一的线性关系
- 树结构:数据元素之间存在着一对多的层次关系
- 图结构:数据元素之间存在着多对多的任意关系
树和图结构也称为非线性结构。
物理结构(存储结构):
物理结构,也称为存储结构,是数据的逻辑结构在计算机中的表示,存储结构除了存储数据元素之外,还必须显示或者隐式存储数据元素之间的逻辑关系。通常有两种存储结构:顺序存储和链接存储。
- 顺序存储结构:顺序存储结构的基本思想:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
- 链接存储结构:用一组任意的存储单元存储数据元素,数据元素直接按的逻辑关系使用指针来表示。
存储结构分为:顺序、链式、索引、散列
数据运算:数据运算是在数据的逻辑结构上定义的操作算法。它在数据的存储结构上实现。常见的数据运算有五种:插入、删除、修改、查找、排序
数据的逻辑结构是从具体的问题中抽象出来的数据模型,是面向问题的,反应了数据元素之间的关联方式或邻接关系。
数据的存储结构是面向计算机的,其基本目标是将数据及其逻辑关系存储到计算机的内存中。通常我们称数据的逻辑结构为数据结构!
2.抽象数据类型:
数据类型(data type):
数据类型是一组值的集合以及定义于这个值集上的一组操作的总称。数据类型规定了该类型数据的取值范围核对这些数据所能采取的操作。
抽象(abstract):
抽象是抽出问题的本质特征而忽略非本质的细节,是对具体事物的一个概括。抽象还可以实现封装和信息隐藏。
抽象数据类型(abstract type):
抽象数据类型,简称ADT,是数据结构以及定义在该结构上的一组操作的总称。ADT可以理解为对数据类型的进一步抽象,数据类型和ADT的区别仅在于:数据类型指的是高级程序设计语言支持的基本数据类型,而ADT指的是子当以的数据类型。
二、算法及算法分析:
算法(algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
算法是对特定问题求解步骤的一种描述,是指令的有限序列。
1.算法必须满足的5个特性:
-
输入:一个算法有零个或者多个输入(即算法可以们没有输入),这些输入通常取自某个特定集合。
-
输出:一个算法有一个或者多个输出(即算法必须有输出),通常输出与输入之间有着某种特定的关系。
-
有穷性:一个算法必须总是(对任何合法的输入)在执行又穷步骤之后结束,且每一步在又穷时间内完成。
-
确定性:算法中的每一条指令必须有确切的含义,不存在二义性。并且,在任何条件下,对于相同的输入只能得到相同的输出。
-
可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
算法和程序不同。程序(program)是对一个算法使用某种程序设计语言的具体实现,原则上,算法可以用任何一种程序设计语言实现。
2.判断算法优劣的特性:
一个好的算法首先满足以上五大特征,此外还需要具备下列特性:
- 正确性:算法能满足具体问题的需求,即对于任何合法的输入,算法都能得到正确的输出。
- 鲁棒性:也称健壮性,算法对于非法输入的抵抗能力,即对于错误输入,算法应该能识别并作出处理,而不是产生错误动作,或者陷入瘫痪。
- 简单性:算法容易理解和实现。
- 抽象分级:算法可以通过模块间的调用完成相应功能,抽象和简化算法思想。每个模块表示一种抽象。
- 高效性:算法效率包括:时间效率和空间效率。时间效率显示了算法运行得有多块;空间效率则显示了算法需要多少额外的存储空间。一个好的算法,应该具有较短的运行时间并占用较少的辅助空间。
3.算法的描述方法:
- 自然语言
- 流程图
- 程序设计语言
- 伪代码
伪代码:
伪代码(pseudo-code)是介于自然语言和程序设计语言之间的方法,采用某一程序设计语言的基本语法,操纵指令可以结合自然语言来设计。
4.算法分析方法:
算法分析是指,我们在阅读代码原型进行分析!!!
度量算法效率的方法:
- 事后统计方法:先将算法实现,然后编入适当的数据运行,测试,计算其时间和空间开销。事后统计法存在许多缺点,编写程序需要花费许多时间和精力和时间,所得到的实验结果依赖于计算机硬件等环境因素。
- 事前分析估算法:渐进复杂度,是对算法所消耗资源的一种估算方法。
5.算法的时间复杂度:
除去计算机硬件因素,影响算法时间的代价最主要的是问题的规模。
- 问题规模:是指输入量的多少,一般来说可以从问题的描述中获得!
为了客观反映一个算法的执行时间,可以用算法中基本语句的执行次数来度量算法的工作量。
- 基本语句:是指执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最终的操作。
这种衡量效率的方法得出的不是时间量,而是一种增长趋势的度量。只考虑问题规模充分大时,算法中基本语句的执行次数在渐进意义下的阶,称为算法渐进时间复杂度。用O(读作"大欧")符号表示。
时间复杂度定义:
若存在两个正常数c和n0,对于任意n>=n0,都有T(n) <= c × f(n),则称T(n) = O(f(n))(或称算法在O(f(n)中)。
基于我们对函数渐近增长的分析,推导大O阶 的表示法有以下几个规则可以使用:
- 用常数1取代运行时间中的所有加法常数;
- 在修改后的运行次数中,只保留高阶项;
- 如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数;
6.算法的空间复杂度:
算法的事件负责度是指算法在执行过程中,需要的辅助空间数量。辅助空间是除了算法本身和输入和输出数据所占据的空间外,算法临时开辟的存储空间。
算法法的空间复杂度计算公式记作:S(n)=0(f(n))其中n为输入规模,f(n)为语句关于n所占存储空间的函数。