数据结构820

数据结构820

第一部分 数据结构及算法的相关概念和术语

1. 数据结构及算法的概念

数据(data): 数据是对客观事物的符号表示,是信息的载体。
在计算机科学中数据指所有能够被计算机识别符号集合。
识别: 输入、存储、处理、显示、输出。
符号: 数字、字母、汉字、语音、图形、图像。
数据元素(Data Element): 是数据(集合)中的一个“个体”,是数据结构中讨论的基本单位

数据项(Data Item): 是数据结构中讨论的最小单位,数据元素可以是数据项的集合。

数据对象(Data Object): 是具有相同性质的数据元素的集合,是数据的一个子集。
数据结构: 带结构的数据元素的集合。
结构: 所谓结构就是数据元素之间的关系,即描述数据元素之间的运算及运算规则。
数据结构包含: 数据元素、数据元素之间的逻辑关系、逻辑关系在计算机中的存储表示、以及所规定的操作这四部分。

2. 数据的逻辑结构和存储结构

逻辑结构: 逻辑结构是指数据元素之间客观存在的关系,与数据在计算机中如何存储无关,主要用于人们理解和交流、以及指导算法的设计。

  • 集合结构: 数据元素之间的关系是“属于同一个集合”。集合结构是数据元素关系极为松散的一种结构。
  • 线性结构: 数据元素之间存在着一对一的关系,可以用一个线性的序列来表示。
  • 树形结构: 数据元素之间存在着一对多的关系,用圆圈表示数据元素,连线表示数据元素之间的关系。
  • 图形结构: 数据元素之间存在着多对多的关系,用圆圈表示数据元素,连线表示数据元素之间的关系。图形结构也称作网状结构。

存储结构(Storage Structure): 数据的存储结构也称物理结构,指数据结构在计算机中的存储表示,包括数据结构中元素的表示及元素间关系的表示。存储结构主要用于指导算法的实现。有三种基本的存储结构,即顺序存储结构、链式存储结构和散列存储结构。

  • 顺序存储结构: 把逻辑上相邻的元素存储在物理位置相邻的存储单元中,特点是借助于数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。
  • 链式存储结构: 在数据元素中添加一些地址域或辅助结构,用于存放数据元素之间的关系,特点是借助于指示数据元素地址的指针表示数据元素之间的逻辑关系,这种方法不要求逻辑上相邻的元素在存储器中的位置也相邻,通常借助于程序设计语言中的指针类型或索引结构来实现。
  • 散列存储结构: 也称哈希(Hash)结构,通过对关键字直接计算得到数据元素的存储位置,特点数据元素的存储和查找都是通过对关键字直接计算得到的。
3. 算法的定义及特性

算法(Algorithm): 算法是求解特定问题的步骤的有限序列。算法由步骤组成,每一个步骤表示一个操作或任务。步骤序列是对问题求解过程的描述,按照步骤的顺序,完成步骤所规定的任务,就可以求解特定的问题。
算法可以用一个三元组来描述:A=(S,D,R):

  • S是步骤的有限集合,S={s1,s2,……sn}。
  • D是算法求解问题所涉及的数据元素集合,是算法的操作或处理的对象,包括可能的输入和算法产生的输出。
  • R是步骤之间的关系集合,由一些控制结构组成:
    • 顺序结构, 依次执行算法的各步骤,如执行步骤A然后执行步骤B。
    • 分支结构(if C then A else B), 如果条件C成立,则执行步骤A,否则执行步骤B。
    • 循环结构(while–do或for–do), 当条件C为真,执行步骤A,或者重复执行步骤A n次。
    • 子过程和递归结构: 调用已有的算法。

算法有四个重要特性:
- 有穷性: 对于任意一组合法输入值,在执行有穷步骤之后算法一定能结束。
- 确定性: 在当前输入数据下,算法每步的任务是确切无二义性的,算法下一步骤执行的顺序也是确定的。
- 可行性: 算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现。
- 功能性(输入、输出特性): 算法都是用作求解特定问题的,不解决问题的步骤序列不是算法,即对任意合法的0或多个输入,完成各步骤的任务,算法所产生的1或多个输出,就是对特定问题所求解的结果。

4. 算法时间复杂度和空间复杂度的分析方法

算法描述:

  • 自然语言描述
  • 框图描述
  • 算法分析(特性)
    • 正确性: 正确性是对算法能否正确求解问题的评价,是首要和最基本的特性。
    • 可读性: 可读性是对算法描述的思路、层次的评价。好的算法应该是思路清晰、层次分明、阅读和修改容易。
    • 健壮性: 健壮性是对算法在异常情况下处理能力的评价。好的算法在出现异常或非法数据时,在操作不当时,算法都能作适当处理。
    • 高效性: 算法的效率是对求解同样问题的不同算法所占用的时间或空间的评价。好的算法应该是高效的,即求解问题所占用存储空间少,执行时间短。

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

  • 事后统计——利用计算机内记时功能,不同算法的程序可以用一组或多组相同的统计数据区分。
  • 事前分析估计——一个高级语言程序在计算机上运行所消耗的时间。

时间复杂度: 随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。简称时间复杂度。——即基本操作(原操作)重复执行的次数的阶数
T(n)=o(f(n))

常见的时间复杂度:

  • 常数阶O (1)
  • 对数阶O (log2n)
  • 线性阶O (n)
  • 线性对数阶O (nlog2n)
  • 多项式阶O (n2)、O (n3)
  • 指数阶O (2n)

多项式阶时间关系为:

  • O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)

指数时间的关系为:
O(2n)<O(n!)<O(nn)

空间复杂度: 算法所需存储空间的量度。
S(n)=o(f(n))
程序除了需要存储空间来寄存本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。

第二部分 线性表

1. 线性表的定义

定义: 一个线性表是n个相同类型数据元素的有限序列。
特征:

  • 元素个数n—表长度,n=0空表。
  • 1<i<n时:
    • ai的直接前驱是ai-1,a1无直接前驱。
    • ai的直接后继是ai+1,an无直接后继。
  • i为数据元素ai在线性表中的位序。
2. 线性表的基本操作及在顺序存储及链式存储上的实现

线性表的基本操作:
线性表初始化操作:

  • Status List_Init (ListPtr L)
  • 初始条件:表L不存在。
  • 操作结果:成功返回success,构造一个空的线性表L;否则返回fatal。

销毁线性表操作:

  • void List_Destory(ListPtr L)
  • 初始条件:表L存在。
  • 操作结果:释放L所占空间。

线性表清空操作:

  • void List_Clear(ListPtr L)
  • 初始条件:表L存在。
  • 操作结果:清除线性表L的所有元素,L变为空表。

线性表判空操作:

  • bool List_Empty(ListPtr L)
  • 初始条件:表L存在。
  • 操作结果:线性表L空返回true,否则返回false。

求线性表的长度操作:
-int List_Size(ListPtr L)

  • 初始条件:表L存在。
  • 操作结果:返回线性表L中的所含数据元素的个数。

取表中元素操作:

  • Status List_Retrieve(ListPtr L,int pos,ElemType* elem)
  • 初始条件:表L存在。
  • 操作结果:若1<= pos <= List_ Size (L),返回success,同时将线性表L中的第pos个元素的值存放在elem中;否则返回range_error

按值查找操作:

  • Status List_Locate(ListPtr L,ElemType elem, int* pos)
  • 初始条件:表L存在, elem是给定的一个数据元素。
  • 操作结果:在表L中查找首次值为elem的数据元素,若找到,返回success,同时将L中首次值为elem的数据元素的序号记入pos; 否则,返回fail。

插入操作:

  • Status List_Insert(ListPtr L,int pos,ElemType elem)。
  • 初始条件:表L存在。
  • 操作结果:若1<= pos <=List_Size(L)+1,且线性表中还有未用的存储空间,在线性表L的第pos个位置上插入一个值为 elem的新元素,原序号为 pos , pos +1, ... , n 的数据元素的序号变为 pos +1, pos +2, ... , n+1,插入后表长=原表长+1, 返回success;否则,若没有空间返回overflow,位置不对返回range_error

删除操作:

  • Status List_Remove(ListPtr L, int pos)
  • 初始条件:表L存在。
  • 操作结果:若1<= pos <=List_Size(L),在线性表L中删除序号为pos的数据元素,删除后使序号为 pos +1, pos +2,..., n 的元素的序号变为 pos, pos +1, ..., n-1,新表长=原表长-1, 返回success;否则返回range_error

求前驱操作:

  • Status List_Prior(ListPtr L, int* pos, ElemType elem)
  • 初始条件:表L存在。
  • 操作结果:若第pos个数据元素的直接前驱存在,将其存入elem中, 返回success;否则返回fail

求后继操作:

  • Status List_Next(ListPtr L, int* pos, ElemType elem)
  • 初始条件:表L存在。
  • 操作结果:若第pos个数据元素的直接后继存在,将其存入elem中, 返回success;否则返回fail

线性表的顺序存储结构:
顺序表:
定义: 用一组地址连续的存储单元存放一个线性表叫线性表。
元素地址计算方法:

  • LOC(ai)=LOC(a1)+(i-1)*L
  • LOC(ai+1)=LOC(ai)+L

特点:

  • 实现逻辑上相邻—物理地址相邻。
  • 实现随机存取。

实现: 可用C语言的一维数组实现。

线性表的链式存储结构:
特点:

  • 用一组任意的存储单元存储线性表的数据元素。
  • 利用指针实现了用不相邻的存储单元存放逻辑上相邻的元素。
  • 每个数据元素ai,除存储本身信息外,还需存储其直接后继的信息。
  • 结点:
    • 数据域:元素本身信息。
    • 指针域:指示直接后继的存储位置。
3. 各种变形链表(循环链表、双向链表、带头结点的链表等)的表示和基本操作的实现
4. 递归过程的特点及实现方法
5. 栈和队列的基本概念;栈和队列的顺序存储结构、链式储存结构及其存储特点
6. 栈和队列的应用
7. 循环队列的判满、判空方法
8. 特殊矩阵的压缩储存

第三部分 广义表的基本概念、存储结构和基本操作

第四部分 树和二叉树

1.树与森林的基本概念
2. 树与森林的存储结构及遍历
3. 二叉树的定义及 6 大性质
4. 二叉树的顺序储存与链式储存结构
5. 二叉树的先序、中序、后序三种遍历方式的关系以及实现;层序遍历的实现
6. 线索二叉树的基本概念与构造方法
7. 树与二叉树的应用:二叉排序树;二叉平衡树;哈夫曼树与哈夫曼编码

第五部分 图

1. 图的基本概念和术语
2. 图的存储结构:邻接矩阵、邻接表、逆邻接表
3. 遍历算法:深度优先搜索算法和广度优先搜索算法
4. 应用:最小生成树;最短路径,拓扑排序和关键路径

第六部分 查找

1. 查找的基本概念;静态查找与动态查找
2. 顺序查找、折半查找、索引查找
3. 哈希查找 哈希函数的基本构造方法,解决地址冲突的基本策略
4. 各种查找算法的时间复杂度和空间复杂度

第七部分 排序

1. 排序的基本概念
2. 插入排序
3. 简单选择排序
4. 希尔排序
5. 快速排序
6. 堆排序
7. 归并排序
8. 基数排序
9. 排序算法的比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值