【数据结构与算法】—算法与算法分析(一)
一、数据
数据是能输入计算机且能被计算机处理的各种符号的集合;是信息的载体,是对客观事物符号化的表示;能够被计算机识别,存储和加工
数据包括:数值型的数据和非数值型的数据
数值型的数据:整数、实数。
非数值型的数据:文字、图像、图形、声音等。
二、数据元素
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据元素也简称为元素、或者称为记录、结点或顶点。
三、数据项
数据项是构成数据元素的不可分割的最小单位。

数据、数据元素、数据项三者之间的关系

四、数据对象
数据对象是性质相同的数据元素的集合,是一个数据的子集。
 数据结构:是指相互之间存在一种或者多种特定关系的数据元素的集合。
数据结构包括以下三个方面的内容:
数据的运算和实现,即对数据元素可以试驾的操作以及这些操作在相应的存储结构上的表现。
五、数据结构的两个层次
逻辑结构
-
描述数据元素之间的逻辑关系 -
与数据的存储无关,独立于计算机
是从具体问题抽象出来的数据模型
物理结构
数据元素以及其关系在计算机存储器中的结构(存储方式);是数据结构在计算机中的表示
逻辑结构与存储结构的关系
存储结构是逻辑关系的映像与元素本身的映像
逻辑结构是数据结构的抽象,存储结构是数据结构的实现
六、 逻辑结构的种类
线性结构:有且仅有一个开始和一个终端的结点,并且所有结点都最多只有一个直接前趋和一个直接后继。例如:线性表、栈、队列、串
非线性结构:一个结点可能有多个直接前趋和直接后继。例如:树、图。
划分方式二—四类基本逻辑结构
- 集合结构:结构中的元素之间除了同属于一个集合的关系外,无任何其他关系。
- 线性关系:结构中的元素之间存在一对一的线性关系。
- 树形结构:结构中的数据元素之间存在着一对多的层次关系。
- 图状结构或者网状结构:结构中的元素之间存在着多对多的任意关系。
七、存储结构的种类
-
顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。C语言中用数组来实现顺序结构。 2.链式存储结构 用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。C语言中用指针来实现链式存储结构。
 

3.索引存储结构
在存储节点信息的同时,还建立附加的索引表
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuQF2oEf-1667122434459)(0100612ab352d1f73bdf1f097e5282ff.png)]](https://img-blog.csdnimg.cn/3ac6c5ff85dc4885a5ec3ce79372602b.png)
4.散列存储结构
根据节点的关键字直接计算出该节点的存储地址

第二章:数据类型和抽象数据类型

数据类型:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。 
抽象数据类型:是指一个数据模型以及定义在此数据模型上的一组操作。
抽象数据类型的形式定义:抽象数据类型可用(D,S,P)三元组表示
其中:
-
D是数据对象 -
S是D上的关系集 -
P是对D的基本操作集

一个抽象数据类型的定义格式如下: 
数据对象,数据关系的定义用伪代码描述
基本操作的定义格式为:   
第三节:抽象数据类型的表现与实现

第四节:算法与算法分析

算法的定义:对特定问题求解方法和步骤的一种描述,它是指令的有限序列,其中每个指令表示一个或者多个操作。

算法的描述

算法的特性:一个算法必须具备以下五个重要的特性:
-
有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷内完成。 -
确定性:算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。 -
可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。 -
输入:一个算法有零个或多个输入 -
输出:一个算法有一个或多个输出 算法设计的要求    

一个好的算法首先要具备正确性,然后是健壮性,可读性、在几个方面都满足的情况下,主要考虑算法的效率
通过算法的效率来评判不同算法的优劣程度。
算法效率通过以下两个方面来考虑:
时间效率:是指算法所耗费的时间。
空间效率:指的是算法执行过程中所耗费的存储空间。
时间效率和空间效率有时候是矛盾的。
算法时间效率的度量
算法时间效率可以依据该算法编制的程序在计算机上执行所消耗的时间来度量。
两种度量方法
事后统计:将算法实现,测算其时间和空间开销
缺点:编写程序实现算法将花费较多的时间和精力,所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣。
事前分析:对算法所消耗资源的一种估算方法(一般采用事前分析)
 
每条语句执行一次所需的时间,一般是随机器而异的,取决于机器的指令性能,速度,以及编译的代码质量,是由机器本身软硬件环境决定的,他与算法无关。
所以,我们可以假设执行每条语句所需要的时间均为单位时间,此时对算法的运行时间的讨论就可以转化为该算法中所有语句的执行次数,即频度之和。


为了便于比较不同算法的时间效率,我们仅比较他们的数量级

数量级越大的越不好 
分析算法时间复杂度的基本方法

分析算法时间复杂度的基本方法
 
算法的时间复杂度:
- 最坏时间复杂度:指在最坏的情况下,算法的时间复杂度
- 平均复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
- 最好时间复杂度:指在最好情况下,算法的时间复杂度
- 一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
时间复杂度T(n)按数量级递增顺序为: 
渐进空间复杂度
渐进空间复杂度:算法所需存储空间的度量
记作:S(n)=O(f(n));其中n为问题的规模(或大小)

|