600X笔记 (week-5 效率与增长量级 内存与查找)

这节课讲得是效率与增长量,简单来讲就是如何将代码写得更有效率,更漂亮。

这里引入一个复杂度big O natation[大O符号]用来表示算法效率。
eg: O(c), O(log(n)), O(n), O(n*log(n)), O(n^c), O(c^n)

其中使用二分法查找的复杂度就是O(logn),使用线性查找复杂度就是O(n)。但使用二分法的前提是列表按顺序排列,有列表结构。不然要对其进行排序才能使用。然而一旦进行排序,那么二分法总体的效率就肯定下降的。
所以问题就在于排序后进行二分查找的成本会比直接使用线性查找的成本低吗?
答案是我们不可能在线性时间内完成排序,或者说排序至少是线性的(毕竟最快也要经历一遍列表才能排序),所以假如对列表只进行一次查找的话,线性查找成本比较低,但换句话说假如对列表进行不仅一次查找呢?(比如要对一个数值a进行k次查找),这时就可以重新考虑一下两者的总成本问题了(平摊成本)。
对列表排序的时候引入了选择排序法,这样的排序复杂度是O(n^c),代价太大了。所以又引入了归并排序法,它的复杂度是O(nlog(n))(这里建议多重温一下视频)。
所以得出的复杂度是O(nlog(n) + k*log(n)),与O(k*n)比较一下,那么若n在合理的范围内,O(nlog(n) + k*log(n))成本会比O(k*n)低。

posted @ 2017-06-28 21:39  Seiei  阅读(116)  评论(0编辑  收藏  举报