一开始讲了算法的空间复杂度和时间复杂度的分析,其怎么由来的,一步步的分析演变,以前看过《算法之道》,这个还有点熟悉,就是具体的例子的时间复杂度的分析不怎么
会,应多加练习,毕竟
这是很基础的东西~
然后就是递归和分治~ 今晚只够时间讲递归~
其实,都看过递归~以前刚刚开始接触的时候觉得很容易,慢慢的就很难了,就是实现代码的时候碰到了思维障碍,过不去,大二时就学过递归~很重要的基础
以前的印象是调用自身,“推卸责任”,数学公式,递归图,经典的Fibonacci数列~
以前就是看或写递归代码的时候就会遇到思维障碍,这很难说明,但就是要理解其中的一个环节时卡住了,不明白为什么~
通过今晚的课,我想,也许是我认识理解递归算法的方式错误了~应该充分的把握其本质(要拿出来用时最直接接触的本质)和“不求甚解”~
今晚,老师将了递归的空间本质,其实就是一个栈,临界结束条件在最顶层,最底层的是n的情况,这个就像是个手榴弹一样,最顶的就是个保险环,我们要写的代码就是保险
环(临界结束条件)和炸药(递归关系,反应链)~这个记忆很重要,因为明确了要写的是什么,就不会出现思维障碍了~理解起来就顺了,要写怎么样的递归代码就一目了然了~
写递归代码,要先推出临界结束条件和递归关系式,然后再去实现代码!!!要分析递归的时间复杂度也是要先写出递归式分析!!!递归:重在“归”和化归差不多!
比如,Fibonacci数列f[n]=f[n-1]+f[n-2],分析的话,就是T(n)变为两个T(n)(T(n-1)和T(n-2)都看为T(n)),就是T(n)=2T(n)+O(1),
每个T(n)都变为2T(n),有n个,即是O(2^n)的复杂度~(其中还有一个O(n),忽略不计)~<注意!这里的两个字“变为”是很重要的思想!!!>
还有就是讲了全排列~很经典~
perm(n)=(变为)rn(perm(n-1))+rn-1(perm(n-1))......r0(perm(n-1))
递归算法,几乎都是找f(n)和f(n-1)或f(n/2)等等的关系!
我相信其实这些都很简单,我知道我所理解的方向不对,即是打开的方式不对罢了,所以才会学算法这么慢!!!加油!!!