最近在复习算法的一些基本思想,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还是没有深刻理解,以后慢慢想想。