数据结构与算法目录(http://www.javashuo.com/article/p-qvigrlkr-da.html)html
数据之间的相互关系称为逻辑结构。一般分为四类基本结构:java
数据结构在计算机中有两种不一样的存储方法:算法
一个算法花费的时间与算法中语句的执行次数成正比例,哪一个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为 T(n)数据结构
在刚才提到的时间频度中,n 称为问题的规模,当 n 不断变化时,时间频度 T(n) 也会不断变化。但有时咱们想知道它变化时呈现什么规律。为此,咱们引入时间复杂度概念。数据结构和算法
通常状况下,算法中基本操做重复执行的次数是问题规模 n 的某个函数,用 T(n) 表示,如有某个辅助函数 f(n),使得当 n 趋近于无穷大时,T(n)/f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数。记做 T(n)=O(f(n)),称 O(f(n)) 为算法的渐进时间复杂度,简称 时间复杂度。函数
随着问题规模 n 的增大,常数部分的影响愈来愈小
T(n) = 2n2 + 4n +log2n + 4指针
随着问题规模 n 的増大,增加最快的项影响愈来愈大
T(n) = 2n2 + 4n + log2n + 4code
渐进时间复杂度只关注增加最快的项
T(n) = O(n2) // 去除常数系数,去除复杂度小的项htm
logn 通常表示 log2nblog
有时候,算法中基本操做重复执行的次数还随问题的输入数据集不一样而不一样,如在冒泡排序中,输入数据有序而无序,其结果是不同的。此时,咱们计算平均值。
常见的算法的时间复杂度之间的关系为:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(2n)<O(n!) < O(nn)
实例 1: T(n) = 1 + n + 2n2 = O(n2)
sum=0; // 执行 1 次 for(i=1;i<=n;i++) // 执行 n 次 for(j=1;j<=n;j++) // 执行 n^2 次 sum++; // 执行 n^2 次
实例 2:T(n) = 1 + 4n = O(n)
a=0; b=1; // 执行 1 次 for (i=1;i<=n;i++) { // 执行 n 次 s=a+b; // 执行 n 次 b=a; // 执行 n 次 a=s; // 执行 n 次 }
实例 3:T(n) = O(log2n)
i=1; // 执行 1 次 while (i<=n) i=i*2; // 设频度是 f(n),则:2^f(n)<=n; f(n)<=log2n
空间复杂度:算法所需存储空间的度量,记做:
S(n) = O(f(n))
其中 n 为问题的规模。
一个算法在计算机存储器上所占用的存储空间,包括存储算法自己所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程当中临时占用的存储空间这三个方面。若是额外空间相对于输入数据量来讲是个常数,则称此算法是原地工做。
算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是经过参数表由调用函数传递而来的,它不随本算法的不一样而改变。存储算法自己所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。
天天用心记录一点点。内容也许不重要,但习惯很重要!