解决问题方法的效率,跟数据的组织方式有关。
解决问题方法的效率,跟空间的利用效率有关。
解决问题方法的效率,跟空间的巧妙程度有关。
什么是数据结构?
- 数据对象在计算机中的组织方式(逻辑结构、物理储存结构)
- 数据对象必定与一系列加在其上的操作相关联
- 完成这些操作所用的方法就是算法
一、抽象数据类型(Abstract Data Type)
- 数据类型
- 数据对象集
- 数据集合相关联的操作集
- 抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言均无关
二、算法(Algorithm)
只描述数据对象集“是什么”,并不涉及“如何做到”的问题
下面是选择排序的伪码描述:
void SelectionSort(int List[], int N)
{
//将N个整数List[0]...List[N-1]进行非递减排序
for(i = 0; i < N; i++)
{
MinPosition = ScanfForMin(List, i, N-1);
//从List[i]到List[N-1]中找到最小元,并将其位置赋给MinPosition
Swap(List[i], List[MinPosition]);
//将末排序部分的最小元换到有序部分的最后位置
}
}
- 一个有限指令集
- 接受一些输入(有些情况下不需要输入)并产生输出
- 一定在有限步骤之后终止
- 每一条指令必须有充分明确的目标,不可以有歧义,且在计算机能处理的范围之内,描述应不依赖于任何一种计算机语言以及具体实现手段
1.空间复杂度S(n)
根据算法携程的程序在执行时占用储存单位的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用内存超限,造成程序非正常中断。
2.时间复杂度T(n)
根据算法携程的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行的结果。
对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度。一般在没有特殊说明的情况下,都是指最坏时间复杂度。
下图的是不同函数随着n的增长的增长速度:
图像看起来更为直观
有了具体的时间则可以体会的更为深刻
复杂度分析小窍门
1.若有两段算法分别由复杂度T1=O(f1(n))和T2=O(f2(n))
T1(n) + T2(n) = max(O(f1(n)),O(f2(n)))
T1(n) * T2(n) = O(f1(n) * f2(n))
2.若T(n)是关于n的k阶多项式,那么T(n)=O(nk)
3.一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
4.if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大
最后,希望我们在今后的学习中,尽量优化自己的代码,变得更加优秀。