经过上一章,http://www.javashuo.com/article/p-arcdicdl-mu.html中能够知道数据结构分为html
1.逻辑结构 包含:算法
1)集合数据结构
2)线性结构函数
3)树形结构spa
4)图结构设计
2.存储结构code
1)顺序存储htm
2)链式存储blog
3)索引存储索引
4)散列存储
以上也是重点须要进行了解的,
废话很少说,跟着第一章走,算法的设计应该知足一下:
1.正确性 :保证是否正确
2.易读性:是否简单易懂
3.健壮性:在输入非法数据时,是否出错
4.时空性:分析 时间复杂度 和空间复杂度 提升算法效率(重点)
选择最优算法的2各度量:
时间复杂度:算法运行时所须要的总步数(从开始运行到打断点)
空间复杂度:算法执行时所占的存储空间(运行后存储空间的大小)
合理地选择一种或者几种操做做为“标准操做”
肯定每一个算法执行了多少次标准操做,并将这次数规定位该算法的计算量
时间复杂度的肯定计算量:
算法的最坏状况时间复杂度:算法在全部输入下的计算量的最大值为计算量
(最坏时间复杂度是至关于运动会的接力棒,从开始到结束总共用的时间被称为最坏时间复杂度)
算法的平均状况时间复杂度:算法在全部输入下的计算量的加权平均值算法的计算量
(平均状况时间复杂度,仍能够用运动会接力来讲,在一段时间内,所平均的值称为 加权平均)
最坏状况时间复杂度和平均状况复杂度统称为时间复杂度
最坏状况时间复杂度+加权平均状况复杂度《= 时间复杂度 (最坏和加权是包含在时间复杂度内的)
void max(int a,b,c,d) {a*=d;b*=d,c*=d; if (a>b)x=a; else x=b; if (c>x)x=c; printf("%d\n",x);} /*有时间能够拿笔算一下这个最坏时间复杂度是多少?*/
常见的时间复杂度按数量级递增排列一次为:
常数 O(1):不管执行多少行没有循环等复杂结构的都是O(1)
int i,j;
i=2;
j=3 i++; j++
i=i+j;
对数阶O(long2n):
1 int a; 2 while(a<n){ 3 a=a*2; 4 }
在while循环里面,每次都将 a 乘以 2,乘完以后,a距离 n 就愈来愈近了。咱们试着求解一下,假设循环x次以后,a 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n
也就是说当循环 log2n 后代码就结束。所以这个代码的时间复杂度为:O(logn)
线性阶O(n):
1 int i; 2 for(i=0,i<n,i++){ 3 printf("*******");}
这段代码,for循环里面的代码会执行n遍,所以它消耗的时间是随着n的变化而变化的,所以这类代码均可以用O(n)来表示它的时间复杂度。
线性对数阶 O(nlong2n):
线性对数阶O(nlogN) 其实很是容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。
1 for(i=1,i<n,i++){ 2 j=1; 3 while(j<n){ 4 j=j*2;}}
平方阶O(n2),
多项式阶OnC),
指数阶O(Cn)
咱们能够将时间复杂度几位输入数据规模n的函数,若求解问题须要执行n2次操做,则记做O(n2)
时间复杂度与时间的关系
空间复杂度:
是一个算法在运行过程当中临时占用存储空间大小的量度。
一个算法在执行期间所须要的存储空间量包括如下部分:
程序代码所占用的空间;
输入数据所占用的空间;
辅助变量所占用的空间;