1.数据:是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理符号的集合。
2.数据元素:是组成数据的,具有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录(理解:人类的基本单位:人,畜禽类的基本单位:鸡,鸟,鱼,鸭)。
3.数据项:一个数据元素可以由若干个数据项组成(理解:人是由胳膊,腿,头...组成的)。
4.数据对象:是性质相同的数据元素的集合,是数据的子集。
数据项是数据元素的子集,数据元素是数据对象的子集
逻辑结构
1.集合结构:集合结构中数据元素除了同属于一个集合外,它们之间没有其他关系。
2.线性结构:线性结构中的数据元素是一对一的关系。
3.树状结构:树状结构的数据元素之间存在一种一对多的层次关系。
4.图形结构:图形结构是多对多的关系。
物理结构:数据的逻辑结构在计算机中的存储形式(顺序存储结构和链式存储结构)
1.顺序存储结构:把数据元素存放在地址连续的存储单元里面,数据间的逻辑关系和物理关系是一致的。
2.链式存储结构:是把数据元素存放在任意的存储单元里面,这种存储单元可以连续,也可以不连续。
算法的特性:1.输入和输出----算法具有零个或多个输入,算法至少有一个或多个输出。2.有穷性---执行有限的步骤,并且每一个步骤都在一个可接受的时间内完成。3.确定性---算法的每一步都具有确定的定义,不会出现二义性。4.可行性---算法的每一步骤都是可行的,也就是说,每一步都可以在有限次内完成。
计算时间复杂度
推导大O阶的方法:1.没有加法常数不予考虑,2.只保留最高阶数项,3.去除这个项(最高阶数项)相乘的常数
for(int i = 0;i<n;i++)
{
printf("hello World!"); /*执行n次*/
}
//复杂度为O(n)
for(int i = 0;i<n;i++)
{
for(int j = i;j<n;j++)
{
printf("hello World!"); //执行n+n-1+n-2+n-3...... = n*(n-1)/2
}
}
//复杂度为O(n^2)
n++; //执行1次
int i,j;
for(i = 0;i<n;i++) //执行n*n
{
for(j = 0;j<n;j++)
{
printf("hello world");
}
}
for(i = 0;i<n;i++) //执行(n*(n+1)/2)
{
for(j = i;j<n;j++)
{
printf("hello world");
}
}
//执行次数f(n) = 1+n*n+n*(n+1)/2 = 3/2*n^2+1/2*n+1,所以时间复杂度为O(n^2)
递归调用:递归次数*每次递归调用的次数
long long Fib(Size_t N)
{
if(N < 3)
return 1; //2^0+2^1+2^2+...+2^(n-1) - X= 2^N-1 /*等比数列*/
return Fib(n-1) + Fib(n-2); //O(2^N)
}
时间复杂度耗费时间从小到大:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)