简述
最近在学校的课程及作业还有导师的项目要学习,所以以后想着用晚上就抽空来写一篇博客吧,我想着自己把按照算法导论这本书来进行大致的讲解一些常用的算法等。一些比较常用的思想写点实例来进行讲解,例如像三个比较重要的算法:分治、动态、贪心算法这三个我也会找空闲的时间来进行写出源代码来进行在博客上写出(C/C++实现),可能由于时间的问题会比较慢,centos的博客我也会更新,还有python的随笔我想着自己记录下矩阵的知识,因为最近也在学习机器学习及模式识别和大数据的内容,我会贴出自己的实现源码。
这是算法的第一课就先简单写下算法的复杂度及渐近记号问题。
对于这些概念想要理解的可以百度或者看下数据结构的书上面有详细的官方讲解。
当然算法的分析与设计默认要回数据结构 例如链表、栈、队列等
复杂度
简单的记录一些复杂度,复杂度在数据结构中主要又两种:空间复杂度和时间复杂度
空间复杂度:空间复杂度是度量算法所需存储空间的大小
时间复杂度:度量算法执行时间的长短
很显然在设计好的算法的时候我们要综合上面的两个关系进行适量的设计。
通常时间复杂度用渐近记号O渐进表示法表示。(也是语句的执行次数)
监禁符号
-
Big-Oh 定义:
f(n) = O(g(n)):存在c>0 和n0,满足下面条件f(n) <= c*g(n) (n>n0)
例子:T(n) = 3n2 + 2n +1 证明T(n) = O(n2) [其中n2表示n的平方]
证明:T(n) = 3n2 + 2n +50 <= 3n2 + 2n2 + n2 = 6n2
存在n > 1 c = 6时满足 T(n) = O(n2)
还有很多的例子 -
Big-Omega定义:
公式定义:存在一个c>0 和n0满足f(n)>=c*g(n) 此时n>=n0
相关的例子:
-
Big-Theta的定义
从上面截图中的定义可以看出该定义是同时满足上面提到的两个定义
算法设计时的一些思考
- 算法的运行时间 big-Oh runing time
- 当然对于一个问题我们设计不同的算法,一个算法为O(n2)一个为O(nlogn),很明显后者的效率要高。
- 所以对于一个问题花费心思设计出来的算法往往比蛮力效率要高很多。
- 当然最后我们还可以进行算法的调整,力争设计出完美实用正确的算法。
后续还会进行补充。。。