百度百科释义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法表明着用系统的方法描述解决问题的策略机制...一个算法的优劣能够用空间复杂度与时间复杂度来衡量。java
懂了没?其实我也懵逼。这些定义都很抽象,对理解这两个概念并无实质性的帮助,你要是深究反而容易陷进误区算法
表达从简单开始~bash
形象地说,数据结构就是指存储数据
的结构。算法就是操做数据
的方法。数据结构
图书馆你总去过吧,图书馆员为了方便读者查找书籍,会把书本分门别类的放好并按规律编号。这里排放规律的书籍
其实就是一种数据结构
。数据结构和算法
那你怎么来找书呢?是一本一本的找;根据 人文与社科,电子与信息技术,城市规划与建设 书馆寻找;仍是到电脑搜索书名再拿着获得的编号找... 这就是 查找的算法
性能
那是由于算法只能做用于特定的数据结构,而数据结构又会根据自身特色推演出特定的算法
。单元测试
好比刚才的例子:学习
能够
一本一本找;分书馆找;按索引找;只能
一本一本找了数据结构是只是种堆放数据的方式,数据结构与算法研究的是如何快和省
的问题,你不根据数据结构
的规律特色谈算法是没用的。测试
刚才咱们说到:数据结构与算法研究的是如何快和省
地解决问题 —— 那如何才算快,怎样才是省呢。
因此如何衡量算法的 执行效率,使用空间 是个很重要的标准 —— 这就须要咱们的 时间复杂度分析
和空间复杂度分析
它有多重要呢 —— 我感受这就是数据结构与算法课程
里的半壁江山,以后说的具体结构和算法都是围着
这个标准转的spa
算法效率的度量方法内有一种就叫过后统计方法
,说白了就是:写个单元测试跑一遍算法,就消耗多少内存,多少时间。
很简单直接。可问题是这个单元测试
这不就是摆明挖坑给本身,就看何时跳嘛。
因此咱们须要一个不依赖
具体测试环境、具体数据,就能够粗略
估计算法执行效率
的方法。
那具体是个怎样的方法呢
无关紧要的解释:
大 O 时间复杂度表示法
表示代码执行时间随数据规模增加的变化趋势,也叫渐进时间复杂度,简称时间复杂度。
咱们从一段普通的java代码
提及~
1 int i;
2 for( i=0; i < n; i++ ){
3 sum = sum + i;
4 }
复制代码
执行状况:
因此这段普通的java代码
执行次数是:2n+1
咱们假设每行
语句的执行一遍的时间是一个单位时间
(unit_time)。因此整段代码总的执行时间:
T(n) = (2n+1)*unit_time
复制代码
尽管咱们不知道 unit_time 的具体值,可是经过公式,咱们知道全部代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
所以咱们能够引出这么条公式:T(n) = O(f(n))
(不用记,继续往下看),因而普通的java代码
执行时间会演变成:
T(n) = O(2n+1)
而后时间复杂度分析
,只关注
执行次数最多
的那段代码,且忽略系数、常量、对数的“底”
。因而最后普通的java代码
的时间复杂度是:O(n)
时间复杂度分析,说到这里基本概念就说完。撒花~~ 不过还有两个容易产生误会的点,须要三申五令:
1 int i, j, q, n = 100;
2 for ( q=0; q < n; q++ ) {
3 printf(“I love u\n”);
4 }
5
6 for( i=0; i < n; i++ ){
7 printf(“I love u”);
8 for( j=0; j < n; j++ ){
9 printf(“ three thousand times\n”);
10 }
11 }
复制代码
执行状况:
时间复杂度分析
,只关注
执行次数最多
的那段代码,且忽略系数、常量、对数的“底”
。
因此最后的时间复杂度为:O(n2) ...(n的2次方)
时间复杂度分析,咱们本质分析的是什么?—— 时间吗?不,咱们看的是代码执行次数。
假设
每行
语句的执行一遍的时间是一个单位时间
(unit_time)—— 是由于有了这个假设,咱们才把次数换单位时间
,从而推导出O(n)
为何专门提这一点呢?咱们举个例子:
1 int i=0;
2 while (i < n) {
3 i = i * 2;
4 }
复制代码
若是你说是O(n),恭喜,我赏你一丈红。答错了!认真看我推导... 咱们假设 x 为执行次数,那么上面代码 x 和 n 的关系为:
因此执行次数
与 n 的关系为:
因为 一次执行次数
等于一个单位时间
,且对数的“底”
。因此最后的时间复杂度为
空间复杂度分析和时间复杂度分析相似,你只须要把 一次执行次数
等于一个单位内存
把大 O 复杂度表示法
重推一遍就会啦~
复杂度分析并不难,关键在于多练。从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)。
虽然 复杂度分析还有最好、最坏、均摊(平均)复杂度分析。 但我的感受 你掌握上面的复杂度分析,再加个均摊复杂度分析。学习工做就够用了。
而均摊复杂度分析,个人理解是
多少种状况 被 各状况的“时间复杂度之和”相除
欢迎点赞+关注,咱们下次再聊