注:请结合具体的书籍学习;推荐《数据结构与算法》、《王道数据结构》,《天勤数据结构》等
离线笔记:https://download.csdn.net/download/qq_38454176/12352560
1. 算法的基本概念
知识结构总览
1.1 什么是算法
程序 = 数据结构 + 算法
数据结构 :如何把现实世界的问题信息化, 将信息存进计算机。同时还要 实现对数据结构的基本操作
算法:如何处理这些信息,以 解决实际问题
实例: 带小孩的顾客优先就餐问题分析:
1.2 算法的5个特性
算法的特性:算法必须具备
的特性
-
有穷性
:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
注: 算法必须是有穷的(用有限步骤解决某 个特定的问题),而程序可以是无穷的(排队系统就是一 个程序,可以永不停歇) -
确定性
:算法中每条指令必须有确切的含义,对于相同的输入
只能得出相同的输出
。 -
可行性
:算法中描述的操作都可以通过已经实现的基本运算执行有限次
来实现。 -
输入
:一个算法有零个或多个输入
(如hello world就是无输入),这些输入取自于某个特定的对象的集合。 -
输出
:一个算法有一个或多个输出
,这些输出是与输入有着某种特定关系的量。
1.3 “好”算法的特质
设计算法时要尽 量追求的目标
-
正确性
:算法应能够正确地解决求解问题。 -
可读性
:算法应具有良好的可读性,以帮助人们理解.
注: 算法可以用伪代码描述,甚至用文字描述, 重要的是要“无歧义”地描述出解决问题的步骤 -
健壮性
:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。 -
高效率
与低存储量需求
:执行速度快。 时间复杂度低;不费内存。 空间复杂度低
2. 算法效率的度量
2.1 时间复杂度
结构总览
注: 算法的性能问题只有在n很大时才会暴露出来
2.1.1 如何评估算法时间开销
- 让算法先运行,事后统计运行时间?
存在什么问题?
- 和机器性能有关,如:超级计算机v.s.单片机
- 和编程语言有关,越高级的语言执行效率越低
- 和编译程序产生的机器指令质量有关
- 有些算法是不能事后再统计的,如:导弹控制算法
2.1.2 算法的时间复杂度
算法的时间复杂:事前预估算法时间开销T(n)与问题规模n的关系(T表示 “time”)
实例:用算法表白——复联4中爱你N遍
两个问题将会在下面进行展开讨论与分析
2.1.3 问题1:是否可以忽略表达式某些部分?
分析与结论:
- 结论1:可以只考虑阶数高的部分
- 结论2:问题规模足够大时, 常数项系数也可以忽略
2.1.4 算法的时间复杂度的运算规则
-
加法规则
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n)))
多项相加,只保留最高阶的项,且系数变为1 -
乘法规则
T(n) = T1(n)×T2(n) = O(f(n))×O(g(n)) = O(f(n)×g(n))
Eg:T3(n)=n^3 +n^2 log2n =O(n^3)+O(n^2 log2n) =???
多项相乘,都保留
时间复杂度大小排列
列如:两个算法的时间复杂度分别如下,哪个的阶数更高(时间复杂度更高)?
2.1.5 问题2:如果有好几千行代码, 按这种方法需要一行一行数?
分析与结论:
2.1.6 几种不同算法表白的分析与结论
- 嵌套循环型:
- 指数递增型
void loveYou(int n) { //n 为问题规模
int i = 1; // 爱你程度
while (i <= n) { //外层循环执行n次
i*2; // 每次翻倍
printf("I Love You %d", i);
}
printf("I Love You More Than %d", n);
}
计算上述算法的时间复杂度T(n): 设最深层循环的语句频度(总共循环的次数)为x,则 由循环条件可知,循环结束时刚好满足 2^x>n
x=log2n+1
T(n)=O(x)=O(log2n)
- 搜索数字型
void loveYou(int flag[], int n) { //n 为问题规模
printf("I anm Iron Man %d");
int i = 1; // 爱你程度
for(int i=0;i<n;i++{ //从第一个元素开始查找
if(flag[i] == n) { //找到元素n
printf("I Love You %d", n);
break; //找到后立即跳出循环
}
}
}
int flag[n] = {1...n};
计算上述算法的时间复杂度T(n)
最好
情况:元素n在第一个位置 ——最好时间复杂度
T(n)=O(1)
最坏
情况:元素n在最后一个位置 ——最坏时间复杂度
T(n)=O(n)
平均
情况:假设元素n在任意一个位置的概率相同为1/n ——平均时间复杂度
T(n)=O(n)
2.1.7 最好,最坏,平均时间复杂度
最坏时间复杂度:最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
最好时间复杂度:最好情况下算法的时间复杂度
2.2 空间复杂度
知识架构:
2.2.1 程序运行时的内存需求(空间复杂度)
案列分析1:
案列分析2:
案列分析3:
2.2.2 函数递归调用带来的内存开销
案例分析1:
案例分析2:
转载:https://blog.csdn.net/qq_38454176/article/details/105679307