一、数据结构
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。
物理结构:是指数据的逻辑结构在计算机中的存储形式。
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
二、算法
算法:一个计算过程,解决问题的方法
算法的特性:输入、输出、有穷性、确定性、可行性
算法设计要求:正确性、可读性、健壮性、时间效率高和存储量低
程序=数据结构+算法
算法时间复杂度
算法时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度级,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。例子:
int i, n = 100, sum = 0;
for(i = 0; i < n; i++)
{
sum += i;
}
上面这段代码,它循环的时间复杂度为O(n)。因为循环体中的代码需要执行n次。
下面我们将代码嵌套一层循环:
for(i = 0; i < n; i++)
{
for(j = i; j < n; j++)
printf("%d",j);
}
注意这时第二层循环的j = i; 我们可以算出循环的公式为
n+(n-1)+(n-2)+···+1 = n(n+1)/2 = n2/2+n/2
由上面的公式 只保留最高项,去除最高项相乘的常数,最终得出O(n2)。
如何推导大O阶呢?
1、用常数1取代运行时间中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高项存在且不是1,则去除与这个项相乘的常数
4、得到的最后结果就是大o阶
常见的时间复杂度所耗费的时间从大到小依次是
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
算法的空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n) = O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
通常我们都是用“时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。
值得注意的是,当直接要让我们求“复杂度”时,通常指的是时间复杂度。