数据结构与算法(C语言版)第一章绪论知识点

本文介绍了数据结构的基本概念,包括数据、数据元素、数据项和数据对象,强调了数据结构的逻辑结构和物理结构。算法的特性、设计要求和效率度量也被探讨,特别是时间复杂度和空间复杂度的概念。此外,提到了数据类型的定义以及抽象数据类型在算法表示中的作用。
摘要由CSDN通过智能技术生成

第一章  绪论

1.2、基本概念和术语

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

  • 数据:是能输入计算机且能被计算机处理的各种符号的集合。是信息的载体;是对客观事物的符号化表示;可以被计算机识别、存储和加工。数据不仅仅包含整型、实型等数值类型,还包含图形、图像、声音、视频及动画等非数值类型
  • 数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录、节点、顶点等。如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。
  • 数据项构成数据元素的不可分割的最小单位

  •  数据对象:是性质相同的数据元素的集合,是数据的一个子集。例:整数数据对象是集合N={0, ±1,±2,...}, 字母字符数据对象是集合C={'A','B', ...‘Z’,'a','b', ..., 'z'}, 学生基本信息表也可以是一个数据对象。

 1.2.2、数据结构(Data Structure)

  • 结构数据元素相互之间的关系称为结构。
  • 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带结构的数据元素的集合 。数据结构可以分为两个层次:逻辑结构和物理结构(存储结构)。
  • 逻辑结构:描述数据元素之间的逻辑关系,它与数据的存储无关,是独立于计算机的。是从具体问题抽象出来的数学模型     
  1. 划分方法一:

 

     2. 划分方法二:

 

  •  物理结构(存储结构):数据的逻辑结构在计算机中(内存)的存储形式。分为顺序存储结构、链式存储结构、索引存储结构、散列存储结构。 
  1. 顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。 C语言用数组来实现顺序存储结构 。

      2.链式存储结构:用一组任意的存储单元存储数据元素(可能连续也可能不连续),数据元素之间的逻辑关系用指针来表示(用指针存放后继元素的存储地址),C语言中用指针来实现链式存储结构 。

  • 数据的运算: 
  1. 逻辑结构和存储结构都相同,但运算不同,则数据结构不同。例如:栈和队列。
  2. 对于一种数据结构,常见的运算有:插入、删除、修改、查找和排序。 

 1.3、数据类型和抽象数据类型

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

数据类型=值的集合+值集合上的一组操作 

  • 抽象数据类型(ADT)是指一个数学模型以及定义在此数学模型上的一组操作。由用户定义,从问题抽象出数据模型(逻辑结构),还包括定义在数据模型上的一组抽象运算(相关操作),不考虑计算机内的具体存储结构与运算的具体实现算法 。
  • ADT的形式定义:抽象数据类型可用(D,S,P)三元组表示 。D是数据对象;S是D上的关系集;数据对象之间的关系构成的集合,(数据对象与数据对象之间可能有多种关系构成了这个集合);P是对D的基本操作集。 

 参数表:赋值参数,只为操作提供输入值。引用参数以"&"打头,除可提供输入值外,还将返回操作结果。

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

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

      

  • 抽象数据类型如何表示和实现: 抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。

教材中用的是类C语言(介于伪码和C语言之间) 作为描述工具。

1.4、算法和算法分析

1.4.1、算法

  • 算法:是对特定问题求解步骤的一种描述,是指令的有限序列。
  • 算法的描述:自然语言、流程图、伪代码和程序代码。
  • 算法与程序程序=数据结构+算法。
  • 算法的五大特性:
  1. 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
  2. 确定性:算法中的每一条指令必须有确切的含义,  在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
  3. 可行性:算法要足够基本,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
  4. 输入:一个算法有零个多个输入。
  5. 输入:一个算法有一个多个输出。 

1.4.2、算法设计的要求

  • 正确性: 能正确的反映问题的需求,能得到正确的答案。算法转化为程序后要注意:a.算法程序没有语法错误;b.算法程序对n组输入产生正确的结果;c.算法程序对典型、苛刻、有刁难性的几组输入数据能够得出满足要求的结果;d.程序对于一切合法的输入数据都能得出满足要求的结果。一般情况下我们把层次3作为算法是否正确的标准。
  • 可读性:算法主要是为了人的阅读与交流,其次才是为计算机执行。因此算法应该易于人的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;
  • 健壮性:当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
  • 高效性:要求花费尽量少的时间和尽量低地的存储需求。

1.4.3、算法效率的度量

  • 一个好的算法在满足要求的情况下,主要考虑算法的效率,通过算法的效率高低来评判不同算法的优劣程度。算法效率从两方面考虑:时间效率(指的是算法所耗费的时间)和空间效率(指的是算法执行过程中所耗费的存储空间)。
  • 度量算法效率的方法
  1. 事后统计: 将算法实现,测算其时间和空间开销。缺点:(1)必须执行程序,编写程序实现算法将花费较多的时间和精力;⑵ 所得实验结果依赖于计算机的软硬件等环境因素。
  2. 事前分析:对算法所消耗资源的一种估算方法
  • 事前分析方法: 一个算法的执行时间大致上等于其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。一条语句的重复执行次数称作语句频度(FrequencyCount)。 所谓的算法分析并非精确统计算法实际执行所需时间,而是针对算法中语句的执行次数做出估计,从中得到算法执行时间的信息。

【i从1~n首先判断条件是否成立,条件满足执行循环体并i++,i=n+1判断条件是否成立条件不满足,退出循环,判断n+1次循环体执行了n次】 

说明:在计算算法时间复杂度时,可以忽略所有低次幂和最高次幂的系数。 

  • 分析算法时间复杂度的基本方法: 
  1.  找出语句频度最大的那条语句作为基本语句;
  2. 计算基本语句的频度,得到问题规模n的某一个函数; 
  3. .取其数量级用O表示 ;

例题: 

 1.4.4、最好、最坏和平均时间复杂度

  • 注意:有的情况算法的基本操作重复执行的次数还随问题输入的数据集不同而不同 。

  1. 最坏时间复杂度是指在最坏情况下算法的的复杂度。
  2. 最好时间复杂度是指在最好情况下算法的的复杂度。
  3. 平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。

通常考虑最坏和平均但有时平均比较难计算只考虑最坏时间复杂度,最坏情况运行时间是一种保证,那就是运行时间不会再坏了。

  • 计算公式: 

  • 时间复杂度T(n)按数量集递增顺序为: 

1.4.5、渐进空间复杂度

  • 空间复杂度:算法所需存储空间的度量。记作:S(n) = O( f(n) ),其中n为问题的规模或大小。
  • 算法要占据的空间
  1.  算法本身要占据的空间:输入/输出、指令、常数、变量等。
  2. 算法要使用的辅助空间。
  • 若输入数据所占据的空间只取决于问题本身和算法无关,这样只需分析该算法在实现时所需的辅助单元即可,若算法执行时所需的辅助单元相对于输入数据量而言是个常数,则称此算法为原地施工,空间复杂度为O(1) 

  • 设计好算法的过程: 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值