1. 何为数据结构?何为算法?
简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上;栈是先进后出,队列是先进先出。
而算法则是对这些数据的操作方法,比如数据的插入、查找、删除、排序等。
二者相辅相成,互为一体,数据结构为算法服务,而算法要在指定数据结构上进行操作。
2. 复杂度分析?
学习数据结构和算法的目的是为了在实际应用的时候更加优化地利用内存,提高程序运行效率,而复杂度分析则是给我们提供一个衡量代码质量好坏的标准。
如果我们在不运行程序的情况下就可以定性知道代码的内存占用和时间消耗,这将会给我们提供一个当前程序的总体评估和未来的改进方向。
直接运行程序就可以知道算法的执行时间和占用内存,但这个过程往往会受到运行环境和数据规模的影响,因此,我们需要一个不用进行具体测试就可以粗略估计算法执行效率的方法,这就是复杂度分析。
3. 时间复杂度
3.1 大 O 复杂度表示法
int cal(int n)
{
int sum = 0;
int i = 1;
for (; i <= n; ++i)
{
sum = sum + i;
}
return sum;
}
我们假设每行代码的运行时间为 t,则第一二行代码需要时间为 2 * t,第三四行代码需要时间为 2n * t,总时间为 (2n+2) * t,代码运行总时间与 n 成正比。
用大 O 法可表示为 O(2n+2),这并不代表代码的实际执行时间,只是表征代码执行时间随数据规模的变化趋势。
当 n 足够大时,低阶、常量和系数就可以忽略不计,直接表示为 O(n)。
3.2 常用分析方法
循环最多代码,重点关注
串行代码,复杂度相加
嵌套代码,复杂度相乘
3.3 几种常见复杂度
多项式量级