基本概念
-
有哪些数据结构?
线性表,栈,队列,串,数组,广义表,树,二叉树,图
重点是线性表,二叉树
每种数据结构需要掌握,添加、更新、删除、查询、排序等操作的实现
学习数据结构的四种境界:
境界1:听懂理论,听懂算法思路
境界2:完成主要数据结构基本算法的实现(理论+实践,数据结构入门)
境界3:完成更多数据结构更多算法的实现
境界4:融会贯通,举一反三,在后续开发中综合应用数据结构知识。
数据(data): 是描述客观事物的数值、字符、以及能输入及其且能被处理的各种符号集合。例如:数值、字符、声音、图像等等。
数据项(data item): 具有原子性,是不可分割的最小数据单位。如学生信息相关的性别。
数据元素(data Element): 数据的基本单位,通常由若干个数据项组成,在计算机程序中通常作为一个整体来处理。如描述一名学生完整信息的数据记录,包含学号、姓名等数据项。
数据对象(data Object): 性质相同的数据元素的集合,数据的子集。如一个学校所有学生的集合。
数据结构(data structure) :互相之间存在一种或多种关系的数据元素的结合,包括逻辑结构,存储结构,数据的运算。
-
数据结构(data structure):相互之间存在一种或多种特定关系的数据元素的集合。
一种是数据结构的逻辑层面,即数据的逻辑结构。
一种是存在于计算机的物理层面,即数据的存储结构。
-
数据结构=逻辑结构+存储结构+在存储结构上的运算/操作
-
数据的逻辑结构:数据元素之间的逻辑关系(和实现无关)
线性结构:有且只有一个开始节点和终端结点,并且所有节点最多只有一个直接前驱和直接后继。
线性表是一个典型的线性结构。
-
分类2:集合结构、线性结构、树状结构、网络结构
逻辑结构有四种基本类型:集合结构、线性结构、树状结构、网络结构。
表和树是最常用的两种高效数据结构。
集合结构:类似数学里的集合。
- 确定性:集合中的元素必须是确定的
- 唯一性:集合中的元素互不相同,{1,a},那么a不等于1
- 无序性:集合中的元素不分先后,{1,2}和{2,1}算同一个集合
线性结构:数据元素之间存在一对一的线性关系的数据关系
树状结构:除了第一个元素以外每个元素有且仅有一个直接前驱元素,但是可以有多个后继元素。一对多的关系。
网状结构:每个数据可以有多个前驱、多个后继。多对多的关系。
数据的存储结构:顺序存储、链式存储、索引存储、散列存储。数据元素本身之间的存储和以及数据元素之间的关系表示,数据的逻辑在计算机中的表示。
顺序存储结构:通常借助数组来实现。采用连续的存储空间。把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。
优点:节省存储空间。分配的存储空间用来存储结点的数据,结点之间的逻辑关系不占用存储空间。可以实现对结点的随机存取,一个结点对应一个序号,通过序号得到存储地址,查询方便。
缺点:插入和删除操作需要移动元素,效率低。
链式存储结构:数据元素对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素。
每个结点有数据域和指针域组成,元素之间的逻辑关系通过存储结点之间的链接关系反映出来。
特点:1 比顺序存储结构密度小。
2 逻辑上相邻的物理结点不必相邻。
3 插入、删除灵活(不必移动结点,只需要改变其中的指针)。
4 查询慢
索引存储结构:除建立存储结点信息外,还建立附加索引表来标识结点的地址。主要面向查找操作,比如图书的目录。
散列存储结构:根据结点的关键字通过散列函数计算出该结点的存储地址。
数据的运算:
引用型运算:不改变数据结构中原有的数据元素的状态,只根据需要读取某些信息
加工型运算:改变数据结构中数据元素的状态,如内容,个数
算法:
对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。
算法的特点:
有穷性:一个算法必须在有限个步骤之后结束
确定性:一个算法的每一个步骤都有其确切的含义,相同的输入必然有相同的输出
可行性:算法中的每一步必须可以通过基本运算的有限次执行实现
输入:零个或多个,取决于特定的数据对象集合。
输出:一个或多个,输出与输入之间存在某种特定的关系。
算法的要求:
正确:算法的执行结果满足预先规定的功能和性能要求
可读:一个算法应当思路清晰,层次分明、简单明了、易读易懂,一个算法不仅是让机器来执行,也是让人来读的
健壮:当输入不合法数据时,算法能够进行适当处理,而不会产生莫名其妙的输出或者引起其他的后果
高效:算法应当具备良好的时空性能
算法的性能分析:
时间复杂度:一个算法在计算机上转换成程序并运行所需要的时间,由问题规模决定。
主要取决于以下因素:
- 硬件的速度:机器的指令性能和速度,一般来讲64位机比32位机要快,主频为2GHZ高于主频为1GHZ
- 书写程序的语言:语言级别越低,运行速度越快: 汇编 > C语言,C++ > Java
- 编译语言所生成的目标代码的质量:对于代码优化比较好的程序,其所生成的目标代码的质量较高
- 问题的规模 : 一般来讲,算法的时间复杂度是问题规模n的函数, T(n) = ∑(ti + ci ) , ti是一条语句需要的时间,ci是语句的频度,即次数
- 如果没有特别说明,一般是指最坏的时间复杂度
空间复杂度:算法运行从开始到结束需要的存储量。
主要由以下构成:
- 固定部分:此部分与所处理数据的大小、个数等无关,主要包括程序代码、常量、简单变量、结构变量等决定。
- 可变部分:此部分与算法在某次执行中处理的特定数据的大小和规模有关。问题规模较大时,可变部分可能大于固定部分。所以一般讨论算法的渐进空间复杂度。