算法心经.数学的应用.积分的应用

算法心经:
    前几天,一个好友告诉我,他要写一本书,叫《编程低手箴言》,我马上管他要地址去看看,出乎意料,写得比我想象得好。后来我就自己在想,是不是也应该把我平时的一些心得写出来呢?越越冲动,既然有了想法,那内容选什么呢?既然讲给别人听,就要拿自己拿手的,也就是最有把握的,要不一贴出来被人们拍死就麻烦了。所以,我把题材选为了讲算法,名字嘛,就姑且叫《算法心经》好了。
   写出点东西,勇气是必不可少的,像CSDN有个知名作者,写过一个什么关于矩阵的新见解,马上被无数潜水的高手们拍得半死,其实我一看很多的批评也没什么道理,即使有道理的也纠缠在名字这种taste differ的范围内,不过因为缺少勇气,他再也不出这个矩阵的续篇了。我就不同,也许差点水平,但绝不差勇气。写这个东东除了给别人看外,也是对自己平时遇到的一些很有意思的问题的总结,如果大家发现了什么不妥,请马上帮我指出来。
   讲算法的资料太多了,大多老一套,贪婪、分枝、限界等,如果想按这个套路学,那大家都去看MIT的算法导论好了,我再写出来也是copy。既然是原创,就要有点新意,下面的内容完全按我对各种算法的思路总结来整理,保证您看着一个与众不同。另外介于本人的水平有限,所有例子只对我碰上读过的感觉有用的问题举例,嫌不够深入的朋友抱歉。
    废话少说,开始...

一,数学的应用:
    我在抱本数学书看时,经常有同学问我,“看这玩意干啥子?“我答曰:”有用“,又问:“有啥用”,我托腮沉思半天,只挤出“反正有用”这种教条结论。的确,地球人都知道数学和计算机关系暧昧,但具体到哪有交集,又说不清楚,我看可能有两个原因:1,还不到能理解到数学用处的水平。2,使数学后,没有归纳总结。我想大多数人属于后者,为了弥补这点,我把平时用到数学的地方总结出来,让大家看看数学的威力。

积分的应用
    微积分是高等数学的基础,但我们搞程序的平时使到微积分的时候实在少之又少,反正我大四以前根本没有用到微积分(编写什么插值求积分那种程序不算),果真如此吗???
    微积分的威力发挥在算法分析上,你会算法分析吗?会的话,肯定会体会到。看看积分的例子:
    “有一个无序数列,每次遍历整个数列查找一个数,然后删除之,重复这个步骤直到数列为空,问这个算法的效率?”
    这个你一眼就看出效率了,遍历的次数从1个增加到n个,那么平均是n/2个,一共执行n次,所以效率是n*n/2,也就是O(n*n),呵呵,很简单,惬意的笑。但细想一想,为什么这里能把n除以2呢?是因为n是个线性函数,所以在计算时可以用它的中间值来计算。这种中间值概念的应用很普遍,很多算法效率的计算有需要,回忆在quick sort的效率分析里,因为整个数列里的每个数与第一个数(比较数)交换的概率相同,那就是绝对的线性关系(函数为常数),所以才可以用,2*T(k)代替T(k)+T(n-k)。

    其实这题也可以用积分来算,效率实际上就是把n在1到n上取积分,也就是n*n/2,和先前的答案一样,注意这里,积分本身是一个连续的数学概念,这里扩展到离散求积分。
    我们把上面的例子改改:
    “有一个有序数列,每次用二分查找找到其中一个值,删除之,重复这个步骤直到数列为空,问这个算法的效率?“
    想啊想啊,二分效率是log(n),从log(n)降到log(1),那么和先前的一样,效率是中间值*n,就是log(n)/2*n,也就是O(n*log(n)),我赶紧握着你的手说,“恭喜你,蒙对了!”,最终的答案确实是O(n*log(n)),但绝不是这么出来的,因为log函数不是线性函数,你绝对不能用中间值代替来进行计算。
    哦!那该怎么计算呢?积分来了。上面的算法实际是对log操作从1增加到n,在数学上实际是离散的对log函数做1到n的积分,也就是对log(n)积分。那log(n)的积分怎么算呢?用Udi的《算法导引》的估计法,我们先估计其积分是n*n,我们对n*n求导
    D(n*n)=2*n>log(n)
    我们的估计大了,那么是不是n*log(n)呢?
    D(n*log(n)) = D(n)*log(n) + n*D(log(n)) = log(n)+ n*1/n=log(n) +1
    哇!我们对了,n*log(n)求导就是log(n)再和一个常数相加,于是可以判断log(n)的积分就是和n*log(n)一个等级的,于是,答案出来了,这个算法的效率是n*log(n),这就是积分的威力。

    下节我们来看微分的应用...

转自:http://hi.baidu.com/jrckkyy/blog/item/d1c1c00e0ed39ac07acbe16a.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值