今天开始复习DS的内容
1. 数据结构前言
1.1 数据结构
数据结构( Data Structure)是计算机**存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。**没有一种单一的数据结构对所有的用途都管用,所以我们要学习各式各样的数据结构,如:线性表、树、图、哈希等
1.2 算法
算法 (Algorithm):j就是定义良好的计算过程,取一个或一组的值作为输入,并产生一个或一组值作为输出。简单来讲算法就是一系列的计算步骤,用来将输入数据转化为输出结果。
算法的5个特性:有穷性,确定性,可行性,输入、输出
数据结构和算法不分家!!!
2. 算法效率
如何衡量一个算法的好坏呢?
看算法的执行时间,占用空间大小:也就是时间复杂度 和空间复杂度
对于我们的执行时间 :我们得不出具体时间(影响执行时间的因素很多,cpu,编译器等),但是可以能够知道执行时间的量级(n n^2 1...)
2.1 复杂度的概念
一般是从时间和空间两个维度来衡量,即为时间复杂度和空间复杂度
时间复杂度衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行时所需要的额外空间。
由于现在计算机容量已经 极大地发展了,因此我们现在不用特别关注空间复杂度了
摩尔定律:

3. 时间复杂度
计算机科学中,**算法的时间复杂度是一个函数式T(N),定量描述了该算法的运行时间。**时间复杂度是衡量程序的时间效率,而不去计算程序的运行时间:

这个T(N)表示了程序的执行次数,N是输入条件,会影响算法的时间复杂度,影响时间复杂度的条件有:每条语句的执行时间*每条语句的执行次数 由于每条语句的执行时间不确定,即使有差别,也微乎其微,可以忽略不计,因此认为每条语句的执行时间是相同的,时间复杂度受执行次数影响


时间复杂度只能表示输入条件对时间的影响趋势
大O渐进表示法来表示算法的复杂度

3.2 示例
示例1

示例2.

示例3:

示例4:

总结:

示例5:
冒泡排序的时间复杂度
一共n个数据 外层循环 排序n趟 第一趟 要比较n-1次,第二趟比较n-2次·····第n-1次比较1次,1累加到n-1 就是一个等差数列(Sn=n(a1+a2)/2),结果也就是n^2+n / 2 ,这样时间复杂度为n方 
示例6:
cpp
void func5(int n)
{
int cnt=1;
while(cnt<n)
{
cnt*=2;
}
}
时间复杂度为O(log2n) ,底数为2,为一个常数,底数对结果的影响不大,所以可以写成logn

示例7:
cpp
// 阶乘
long long Fac(size_t N)
{
if(0==N)
return 1;
return Fac(N-1)*N;
}

这是一个函数递归,时间复杂度和空间复杂度都为O(N)
4.空间复杂度
注意:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间就已经确定好了,因此空间复杂度主要通过函数在运行时显示申请的额外空间来确定
示例1:
比如上面的冒泡排序 的空间复杂度,函数栈帧在编译期间已经确定好了,只需要关注函数运行时额外申请的空间,

示例2:

前面阶乘递归的
每次进入循环都要重新创建一次函数栈帧,需要额外申请N-1个空间,所以空间复杂度也为O(N)
5.常见复杂度对比

