线性表、栈、队列、(字符)串、数组、广义表、树、二叉树、图
数据的结构类型:(逻辑和存储)
逻辑结构:
分类一:线性结构和非线性结构
- 指数据元素之间的逻辑关系(和现实无关)。
线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。线性表就是一个典型的线性结构,它有四个基本特征
- 1.集合中必存在唯一的一个“第一个元素”;
- 2.集合中必存在唯一的一个“最后的元素”;
- 3.除最后元素之外,其他数据元素均有唯一的“后继”;
- 4.除第一元素之外,其他数据元素均有唯一的“前驱”;
非线性结构:一个结点元素可能对应多个直接前驱和多个直接后继。
常见有:树(二叉树),图(网)等。
分类二:集合结构、线性结构、树状结构、网格结构
表和树是最常见的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实习。
集合结构:就是数学中所学的集合,集合中元素有三个特征:
- 1.确定性(集合中的元素必须是确定的)
- 2.唯一性(集合中的元素互不相同。例如:集合A={1,a),则a不能等于1)
- 3.无序性(集合中的元素没有先后之分),如集合{3,5,4}和{3,4,5}算作同一个集合,该结构的数据元素间的关系是“属于同一个集合”,别无其他关系。因为集合中元素关系很弱,数据结构中不对该结构进行研究。
线性结构:数据结构中线性结构指的是数据元素存在着“一对一”的线性关系的数据结构。
树状结构:除了一个数据元素以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后续元素。特点是数据元素之间是1对多的联系。
网络结构:每个数据元素可以有多个直接前驱元素,也可以有多个直接后续元素。特点是数据元素之间是多对多的联系。
数据的存储结构:
数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示,是数据的逻辑结构在计算机中的表示。
常见的存储结构有顺序存储、链式存储、索引存储、散列存储。
顺序存储结构:
把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言的数组来描述的。(数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后续关系通过数据元素,在存储器中的相对位置来反映)
优点:节省存储空间,因为分配给数据的存储单元完全用存放结点的数据,结点之间的逻辑关系没有占用额外的存储空间。
采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。
缺点:插入和删除操作需要移动元素,效率较低。
链式存储结构:
数据元素的存储对应的是不连续的存储空间,每个存储节点对应一个需要存储的数据元素。
每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的链接关系反映出来。
特点:
- 1.比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)
- 2.逻辑上相邻的节点物理上不必相邻。
- 3.插入、删除灵活(不必移动节点,只要改变节点中的指针)。
- 4.查找结点时链式存储要比顺序存储慢。
索引存储结构:
除建立存储节点信息之外,还建立附加的索引表来标识节点的地址。
比如图书、字典的目录
算法(algorithm):
是指令的集合,是为解决特点问题而规定的一系列操作。
它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据集合作为输出。
一个算法通常来说具有以下五个特征:
- 1.输入:一个算法应以待解决的问题的信息作为输入。
- 2.输出:出入对应指令集处理后得到的信息。
- 3.可行性:算法是可行的,即算法中的每一条指令都是可以实现的,均能在有限的时间内完成,
- 4.有穷性:算法执行的指令个数是有限的,每个指令又是在有限时间内完成的,因此整个算法也是在有限时间内可以结束的。
- 5.确定性:算法对于特定的合法输入,其对应的输出是唯一的。即当算法从一个特定输入开始,多次执行同一指令集结果总是相同的。
简单来说,算法就是计算机解题的过程
这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法
前者是算法的逻辑形式,后者是算法的代码形成。
举例:如何求1+2+3+...+100=?
算法1:依次相加
算法2:高斯解法:首位相加*50/2
算法3:递归实现:sum(100) =sum(99)+100 sum(99)=sum(98)+99....sum(2)=sum(1)+2 sum(1)=1
评价算法优劣的依据:复杂度(时间和空间)
复杂度(问题的规模):时间的频度去掉低阶相和首项常数。
T(n) = O(n2)
频度:算法语句执行次数
T(n),n表示问题的规模
最坏时间复杂度:
- 1.难计算
- 2.有很多算法的平均情况和最差情况的复杂度是一样的
一般讨论最坏时间复杂度
定义:
- O:最坏时间复杂度的上界,T(n) = O(n2)
- Θ:最好最坏同一级别,T(n) = Θ(n2)
- Ω:最好的情况 ,T(n) = Ω(n2)
常用的时间复杂度级别:
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(n*log2n)
- 平方阶O(n2)
- 立法阶O(n3)
- K次方阶O(nk)
- 指数阶O(2n)
- 阶乘阶O(n!)
级别越高,效率越低