数据结构与算法基础---绪论



前言

  本文主要是为后续学习打一个基础,对相关概念有一定的了解即可,不需要花费太多的时间~

1 数据结构的研究内容

  现实中的一些问题无法用数学公式或方程来描述,是一些“非数值计算”的程序设计问题。
  描述非数值计算问题的数学模型不是数学方程,而是诸如表、树和图之类的具有逻辑关系的数据。
  数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
在这里插入图片描述

2 基本概念和术语

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

(1)数据(Data)

  是能输入计算机且能被计算机处理的各种符号的集合
  信息的载体
  是对客观事物符号化的表示
  能够被计算机识别、存储和加工
  包括:
    数值型的数据:整数、实数等
    非数值型的数据:文字、图像、图形、声音等
(2)数据元素(Data Element)

  是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
  也简称为元素,或称为记录、结点或顶点
  一个数据元素可由若干个数据项组成
(3)数据项(Data Item)

  构成数据元素的不可分割的最小单位
  数据、数据元素、数据项三者之间的关系:
  数据 > 数据元素 > 数据项
(4)数据对象(Data Object)

  是性质相同的数据元素的集合,是数据的一个子集
  数据元素–组成数据的基本单位:是集合的个体
  数据对象–性质相同的数据元素的集合:是集合的子集

2.2 数据结构(Data Structure)

  数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构
  是指相互之间存在一种或多种特定关系的数据元素集合
  或者说,数据结构是带结构的数据元素的集合
  包括以下三个方面的内容:
  (1)数据元素之间的逻辑关系,也称为逻辑结构

    描述数据元素之间的逻辑关系
    与数据的存储无关,独立于计算机
    是从具体问题抽象出来的数学模型
   (2)数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构

    数据元素及其关系在计算机存储器中的结构(存储方式)
    是数据结构在计算机中的表示

   (3)数据的运算和实现

    即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
    逻辑结构与存储结构的关系
    存储结构是逻辑关系的映像与元素本身的映像
    逻辑结构是数据结构的抽象,存储结构是数据结构的实现
    两者综合起来建立了数据元素之间的结构关系

逻辑结构的种类

划分方法一

(1)线性结构
  有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继
  例如:线性表、栈、队列、串
(2)非线性结构
  一个结点可能有多个直接前趋和直接后继
  例如:树、图

划分方法二–四类基本逻辑结构

(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系

(2)线性结构:结构中的数据元素之间存在着一对一的线性关系

(3)树形结构:结构中的数据元素之间存在着一对多的层次关系

(4)图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系

在这里插入图片描述
存储结构的种类(四种基本的存储结构)

(1)顺序存储结构
  用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示
  C语言中用数组来实现顺序存储结构
(2)链式存储结构
  用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
  C语言中用指针来实现链式存储结构(存放当前数据元素和下一个数据元素的地址)
(3)索引存储结构
  在存储结点信息的同时,还建立附加的索引表(Index)
(4)散列存储结构
  根据结点的关键字直接计算出该结点的存储地址

2.3 数据类型和抽象数据类型

  在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型
  例如,C语言中:
    提供int,char,float,double等基本数据类型
    数组、结构、共用体、枚举等构造数据类型
    还有指针、空(void)类型
    用户也可用typedef自己定义数据类型

  一些最基本数据结构可以用数据类型来实现,如数组、字符串等
  而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示
  高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许进行的操作
  例如,C语言中
    定义变量i为int类型,就是表示i是[-min,max]范围的整数,在这个整数集上可以进行+、-、*、/、%等操作
在这里插入图片描述

2.3.1 数据类型(Data Type)

定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称
  数据类型 = 值的集合 + 值集合上的一组操作

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

是指一个数学模型以及定义在此数学模型上的一组操作
  由用户定义,从问题抽象出数据模型(逻辑结构)
  还包括定义在数据模型上的一组抽象运算(相关操作)
不考虑计算机内的具体存储结构与运算的具体实现算法
例如圆:
  到某个点的距离相等的点的集合(圆心和半径)
  运算:构造圆、求面积、求周长

抽象数据类型的形式定义
抽象数据类型可用(D,S,P)三元组表示
  其中:D是数据对象,S是D上的关系集,P是对D的基本操作集
一个抽象数据类型的定义格式如下:
   ADT 抽象数据类型名{
    数据对象:<数据对象的定义>
    数据关系:<数据关系的定义>
    基本操作:<基本操作的定义>
  }ADT 抽象数据类型名
其中:
(1)数据对象、数据关系的定义用伪代码描述
(2)基本操作的定义格式为:
  基本操作名(参数表)
    初始条件:<初始条件描述>
    操作结果:<操作结果描述>
基本操作定义格式说明:
参数表:
  赋值参数 只为操作提供输入值
  引用参数 以&打头,除可提供输入值外,还将返回操作结果(参考引用的含义,修改参数本身的值)
初始条件:
  描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之。
操作结果:
  说明操作正常完成之后,数据结构的变化状况和应返回的结果。

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

  一个问题抽象为一个抽象数据类型后,仅是形式上的抽象定义,还没有达到问题解决的目的,要实现这个目标,就要把抽象的变成具体的,即抽象数据类型在计算机上实现,变为一个能用的具体的数据类型。
  在C语言中,用已有数据类型定义描述它的存储结构,用函数定义描述它的操作
  抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现
  即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作

4 算法和算法分析

4.1 算法

算法的定义

  对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。
  简而言之,算法就是解决问题的方法和步骤
算法的描述

  自然语言:英语、中文
  流程图:传统流程图、NS流程图
  伪代码:类语言(类C语言)
  程序代码:C语言程序、JAVA语言程序
算法与程序

  算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法
  程序是用某种程序设计语言对算法的具体实现
  程序 = 数据结构 + 算法
  数据结构通过算法实现操作、算法根据数据结构设计程序
算法特性(五个)

(1)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
(2)确定性:算法中的每一条指令必须有明确的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出
(3)可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
(4)输入:一个算法有零个或多个输入
(5)输出:一个算法有一个或多个输出
算法设计的要求

(1)正确性(Correctness)
  程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果(衡量标准)
(2)可读性(Readability)
  算法主要是为了人的阅读和交流,其次才是为计算机执行,因此算法应该易于人的理解
  另一方面,晦涩难读的算法易于隐藏较多错误而难以调试
(3)健壮性(Robustness)
  指当输入非法数据时,算法恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果
  处理出错的方法,不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理
(4)高效性(Efficiency)
  要求花费尽量少的时间和尽量低的存储需求

4.2 算法分析

算法分析

  一个好的算法首先要具备正确性,然后是健壮性,可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来评判不同算法的优劣程序
  算法效率考虑两方面
  (1)时间效率:指的是算法所耗费的时间
  (2)空间效率:指的是算法执行过程中所耗费的存储空间
  时间效率和空间效率有时候是矛盾的
算法时间效率的度量

  算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量
  两种度量方法
  (1)事后统计
    将算法实现,测算其时间和空间开销
    缺点:
    <1>编写程序实现算法将花费较多的时间和精力;
    <2>所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣
  (2)事前分析
    对算法所消耗资源的一种估算方法

  一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单的操作(如赋值、比 较、移动等)所需的时间与算法中进行的简单操作次数乘积

    算法运行时间 = 一个简单操作所需的时间 * 简单操作次数

  也即算法中每条语句的执行时间之和

    算法运行时间 = ∑每条语句的执行次数 * 该语句执行一次所需的时间
    算法运行时间 = ∑每条语句频度 * 该语句执行一次所需的时间

  每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度以及编译的代码质量。是由机器本身软硬件环境决定的,它与算法无关
  所以,我们可以假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了
  这就可以独立于不同机器的软硬件环境来分析算法的时间性能了
算法时间复杂度的渐近表示法

  为了便于比较不同算法的时间效率,我们仅比较它们的数量级
  若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n) = O(f(n)),称O(f(n))为算法的渐近时间复杂度(O是数量级的符号),简称时间复杂度
  一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示
  算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n) = O(f(n))
  它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度
  数学符号“O”的定义为:若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n) = O(f(n))表示存在正的常数C和n0,使得当n≥n0时都满足0≤T(n)≤Cf(n)
  基本语句(三个判断标准)
  (1)算法中重复执行次数和算法的执行时间成正比的语句
  (2)对算法运行时间的贡献最大
  (3)执行次数最多
  问题规模n
  n越大算法的执行时间越长
    排序:n为记录数
    矩阵:n为矩阵的阶数
    多项式:n为多项式的项数
    集合:n为元素个数
    树:n为树的结点个数
    图:n为图的顶点数或边数
分析算法时间复杂度的基本方法

  定理1.1 若f(n) = am*n^m + a(m-1)n^(m-1) + … + a1n + a0是m次多项式,则T(n) = O(n^m)
  忽略所有低次幂项最高次幂系数,体现出增长率的含义
  (1)找出语句频度最大的那条语句作为基本语句
  (2)计算基本语句的频度得到问题规模n的某个函数f(n)
  (3)取其数量级用符号“O”表示
  时间复杂度是由嵌套最深层语句的频度决定的
算法时间复杂度计算

  请注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
  最坏时间复杂度:指在最坏情况下,算法的时间复杂度
  平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间
  最好时间复杂度:指在最好情况下,算法的时间复杂度
  一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长
  对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度
  (1)加法规则
    T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))
  (2)乘法规则
    T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n)*g(n))
算法时间效率的比较

  当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊
  时间复杂度T(n)按数量级递增顺序为:
  O(1)< O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)
渐进空间复杂度

  空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n)),其中n为问题的规模(或大小)
  算法要占据的空间
  (1)算法本身要占据的空间,输入/输出,指令,常数,变量等
  (2)算法要使用的辅助空间
设计好算法的过程

  抽象数据类型 = 数据的逻辑结构 + 抽象运算(运算的功能描述)
  算法分析

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值