数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输出给别的计算机处理的符号的集合。包括整型、实型等数值类型,还有声音、图像、视频等非数值类型。
数据对象是具有相同特征的数据元素的集合,是数据的一个子集。
数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。
数据项是组成数据的不可分割的最小单位。
关系:数据对象就相当于一个班的学生,而每个学生又是班级这个对象的数据元素,此数据元素由学号、姓名等数据项组成。
数据结构即为相互之间存在一种或多种特定关系的数据元素的集合。包括逻辑结构和物理结构。
逻辑结构:数据对象中数据元素之间的相互关系。(集合结构、线性结构、树形结构、图形结构)
物理结构:数据的逻辑结构在计算机中的存储形式。包括顺序存储和链式存储。
顺序存储即数据元素存储在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一样的,即第一个元素存储在第一个位置
链式存储即把数据元素存放在任意的存储单元里,此存储单元可以是连续的,也可以是不连续的。即存储关系并不能反应器逻辑关系,需要用指针存放数据元素的地址,通过地址就可以找到相关联数据元素的位置。就像去医院挂号一样,只要你领到了号码,就可以等待叫号了。等待的时候,爱去哪去哪,看病的顺序与你的位置无关,只与你的挂号卡有关。
算法是对解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的特性:零个或多个输入、一个或多个输出、有穷性(有限步骤)、确定性(每一步都有确定的含义,不会出现二义性)、可行性(每一步都必须可行,即每一部都能通过执行有限次数完成)
算法设计的要求:正确性(即满足算法的特性)、可读性(便于阅读、理解和交流)、健壮性(即能对不合理情况做出相应的处理,而不是产生异常)、时间效率高和存储量低
算法的时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度也就是算法的时间度量,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
常数阶:O(1)
以求和算法为例:
int sum = 0, n = 100; //执行一次
sum = (1 + n)*n / 2; //执行一次
printf("%d", sum); //执行一次
线性阶:O(n)
下面代码中循环体中的代码要执行n次
int i;
for (i = 0; i < n; i++)
{
//时间复杂度为O(1)的程序步骤序列
}
对数阶:O(logn)
下面例子为有多少个2相乘后值大于n,即以2为底n的对数
int count = 1;
while (count < n)
{
count = count * 2;
}
平方阶:O(n^2)
循环嵌套语句
内层循环语句时间复杂度为O(n),外层循环不过是内层时间复杂度为O(n)的语句再循环n次,即为n^2
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
}
}
常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)