Fibonacci in O(logn)

最近在复习算法的一些基本思想,greedy、divide and conquer、dynamic programming……

很基本的思想,没有太多的收获。可是刚刚看了一点dp的东西,非常之惊讶,Fibonacci居然可以用O(logn)搞定

dp传统思想的话,自然是O(n)

然后这个家伙给出了一个恒等式:

==》

当然,也是我愚钝,看到这里还没有想到可以用O(logn),以为只是一个漂亮的数学表达。

结果这家伙一说O(logn),我愣了。仔细想了一下才发现,一个数的n次方可以用O(logn)。。。divide and conquer还是没有做到随心所欲

虽然这个东西没什么意义,因为fibonacci是指数级增长的,只是写出结果就要线性时间以上,不过这个分析真的很有意思

 

最后小小总结一下算法思想:

greedy:

1. subproblem is optimal

2. easy to find the metric

发现greedy还是太弱,比起dp来,对实际问题很难起到实质性作用,起到实质性问题的又往往是很平庸的问题。不过greedy在图算法里还是太好用了,BFS,DFS,Topological ordering,Minimun Spanning Tree, Dijstra。。。

 

divide and conquer:

1. divide balance

2. merge linear

这两步都可以很难,很多时候需要大量的证明。最重要的感觉还是找出特殊的数学特性。

 

dp:

1. write the recurrence

2. fill the table

第二步其实可以忽略的,写出了recurrence,想填不对也难。recurrence很关键的还是找出需要的子问题空间,基本是确定维度的问题。从weighted interval schedule的一维(其实可以当二维做),到knapsack的二维,再到bellman-ford的三维,太有意思了。不过bellman-ford的改进里面有一个balance divide的思想,还是要好好吸收一下。

 

sweeping line:

1. sort lexcigraphic

2. creat the event queue(using a balance binary search tree) and a sweeping line status(using heap or bbst)

3. sweep, for each point, do something

开始还以为这只是个小小的tricky, 没想到听高老师说还是个相当强力的工具。想想也是,給一堆纷乱无章的点,即使发现了它们的数学特性,也还是需要一个起点和方向去逐步处理它们。怪不得computational geometry这么依赖这个家伙。

 

randomized incremental还是没有深刻理解,以后慢慢想想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值