绪论
数据结构基本概念
数据结构:相互之间存在一种或多种特定关系的数据元素的集合。数据结构研究数据元素之间的相互关系,以及定义在其上的一组基本操作。
数据结构主要包括逻辑结构、存储结构和运算集合三部分的内容:
(1)逻辑结构:描述数据元素之间的逻辑关系;
(2)存储结构:数据元素及其逻辑关系在计算机中的表示(映像),也称为物理结构;
(3)运算集合:实现对数据元素及其逻辑关系的基本操作(如插入、删除、输出等)。
算法及其复杂性
算法:是规则的有限集合,是求解特定问题的过程描述、操作步骤或指令序列。
算法的5个重要特性:
-
有穷性:对于任意一组合法的输入,一个算法必须总在执行有穷步骤之后结束,每一步都能在有限时间内完成。
-
确定性:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且在任何条件下,算法都只有一条执行路径 ——相同输入得到相同输出。
-
可行性:一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
-
输入项:有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。
-
输出项:一个或多个与“输入”有确定关系的量值,是算法进行信息加工后得到的结果。
算法设计的要求:
-
正确性
-
可读性
-
健壮性:当输入数据非法时,算法能够作出反映或进行相应处理(不能出现莫名其妙的输出结果),且处理出错的方法不是中断程序的执行,而是返回一个表示错误性质的信息。
-
高效率
-
低存储
算法的复杂性分析
算法复杂度:算法占用机器资源的多少,主要有算法运行所需的机器时间和所占用的存储空间。
时间复杂度:算法运行所需要的执行时间,T(n)= O(f(n))。
空间复杂度:算法运行所需要的存储空间度量,S(n)= O(f(n))。
算法时间复杂度的估算方法:
从算法中选取一种原操作(对于所研究的问题来说,该操作是基本操作),将该操作重复执行的次数作为算法时间复杂度的衡量准则。时间复杂度与原操作的执行次数之和成正比。
例 for (i=1; i<=n; ++i) s+=i; => T(n)=O(n)
判断算法的时间复杂度,常见的有:
线性表
线性结构
线性结构:是一个数据元素的有限序列,如(a1 , a2 , …, an),其逻辑关系如下:
逻辑结构特征:在数据元素的非空有限集中,
(1)存在唯一的第1个数据元素;
(2)存在唯一的最后1个数据元素;
(3)第i(>1)个数据元素有唯一的1个前驱;
(4)第j(<n)个数据元素有唯一的1个后继。
表结构
线性表的形式定义:
(1)顺序存储结构——由位置描述逻辑关系
(2)链式存储结构——由指针描述逻辑关系
顺序表
顺序表:用一组地址连续的存储单元存储线性表的数据元素(a1 , a2 , …, an)。
顺序存储结构:
顺序表的主要特点:
(1)存储空间利用率高——只存储元素值。
(2)随机存取——可以通过计算来确定顺序表中第i个数据元素的存储地址 Li = L0+(i-1)*m,其中,L0为第一个数据元素的存储地址,m为每个数据元素所占用的存储单元数。
(3)插入和删除数据元素会引起大量结点移动。
链表
链表:链表是一种能够动态进行存储分配的数据结构。当需要插入数据元素时,申请一个结点的地址单元,并将该单元链入线性表中。
链式存储结构:
链表的主要特点:
(1) 存储空间利用率低——结点中包含自身信息域和表示链接信息的指针域。
(2) 逻辑位置相邻的结点 (如a2和a3),在物理位置上不一定相邻(需要结点时才申请空间)。
(3) 删除和插入结点操作比较灵活——只要修改相关结点的指针即可,不必移动结点。
循环链表
定义:链表中最后一个结点的指针指向头结点——从链表中的任一结点出发均可访问到其它结点。
双向链表
定义:链表的每个结点包含两个指针域,一个指向后继,一个指向前驱。
双向链表结构类型:
栈和队列
栈和队列都是限制在“端点”进行插入操作和删除操作的线性表。
栈
栈是一种后进先出(LIFO)的线性表。
顺序栈
顺序栈:用顺序存储结构表示的栈。
队列
队列是一种先进先出(FIFO)的线性表。
顺序队列
顺序队列:用顺序存储结构表示的队列。
链队列
链队列:用链式存储结构表示的队列。
循环队列
循环队列目的是为了消除顺序队列的假溢出。
我的理解:顺序队列(动态数组)在进行插入和删除操作时,会发生插入操作不断申请新的内存空间,而删除操作不断删除前面申请空间中寄存的元素。这会导致前面申请的空间的浪费,实际上申请的空间并没有被利用但程序判定溢出而不断申请新的空间,这就是所谓的“假溢出”。
循环队列存储类型:
括号匹配检验
算术表达式求值
串
串(字符串):是零个或多个字符组成的有限序列。
记作: S=“a1a2a3…”,其中S是串名,ai (1≦i≦n) 可以是字母、数字或其它字符。
串的抽象数据类型定义:
串的存储表示和实现
串是一种特殊的线性表,其存储表示和线性表类似,但又不完全相同。串的存储方式取决于将要对串所进行的操作。串在计算机中有3种表示方式:
定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。
堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分配的。
块链存储方式:是一种链式存储结构表示。
数组
广义表
广义表:是由n(n ≧0)个元素组成的有穷序列: LS=(a1,a2,…,an)