- 数据结构
1.数据结构中的术语:数据元素是数据的基本单位;数据项是数据中有独立含义,不可分割的最小标识单位;关键字是能够识别该元素的一个或者多个数据项,能唯一识别的数据项称为主关键字。
2.数据结构的逻辑结构和存储结构
逻辑结构:对人来说的结构,元素间的逻辑结构,不用代码来实现,独立于计算机。通常分为三种:线性结构(一对一),树结构(一对多),图(多对多)(详细解释离散数学)。
存储结构:即数据在计算机中储存的结构,也称为物理结构。存储结构只有两中:顺序储存(数组)和链式储存(链表)。由这两种储存结构可以组合出更方便高效的储存结构。
数据结构对数据的操作初始化;判断是否为空;存取;统计元素个数;遍历(依照某种次序访问数据结构中的每一个数据元素,得到一个线性序列);插入;查找;排序。
数据类型:指数据的基本类型和对应的操作,比如float型数据无法进行求余数运算。
抽象数据类型(ADT):人为规定的数据操作,比如规定成绩这类数据不能为负数。包括数据抽象和数据封装。 - 算法
算法的定义:(1)有穷性(2)确定性(3)可行性(4)有输入(零或多个输入)(5)有输出(必须有大于零的输出)。不满足以上定义的都不能称之为算法。
算法常用的描述法:(1)用自然语言描述(2)流程图(3)N-S流程图(4)伪代码。
衡量算法优劣性:(1)正确性(2)可读性(3)健壮性(4)效率和低存储量。
算法的效率度量:在度量一个算法效率的高低时有两种方法,一种是算法结束后统计时间,但是由于之后统计时间复杂度高且控制变量无比麻烦,况且容易造成写了好几年的算法效率极低只能推到重来的惨剧,所以一般采用事前分析法,用大O表示法来预估代码的时间效率和空间效率。
大O表示法:一句代码在运行过程中随着数据量而变化的运行次数为此算法的阶数,,比如如果在n 个数据中顺序查找某个元素,对应以下代码(JAVA):
for(int i=0;i<n;i++){//执行n+1次,因为第n次条件不满足时也执行这句
if(array[i]==target)//执行n+1次
System.out.println("found!");//执行一次,常量
}
以上代码块执行的时间复杂度为:(n+1)+(n+1)+1
根据大O 表示法中省略常量,则可以表示为O(n)
因为自己对这部分没能理解透彻所以再举一个例子(JAVA):
for(int i=0;i<n;i++)//n+1
for(int j=0;j<n;j++)//n*(n+1),自身执行n 次
y++;//n*n
for(int k=0;k<j;k++)//n*(n+1)*(n-1)自身执行n-1次
y++;//n*n*(n+1)/2这句用求和公式得出
以上代码块时间复杂度为O(n^3)
其他求时间复杂度的方法放在下个博客进行总结。