分治策略 | Algorithm



分治策略 | Algorithm

分治策略的基本思想

分治策略(Divide and Conquer) 将原始问题划分或者归结为规模较小的子问题 递归或迭代求解每个子问题 将子问题的解综合得到原问题的解

注意: 子问题与原始问题性质完全一样 子问题之间可彼此独立地求解 递归停止时子问题可直接求解(子问题足够小)

二分检索

设计思想 通过x与中位数的比较,将原问题归结为规模减半的子问题 对子问题进行二分检索 当子问题规模为1时,直接比较x与T[m],若相等则返回m,否则返回0

时间复杂度分析

二分归并排序

设计思想 划分将原问题归结为规模为n/2的2个子问题 继续划分,当子问题规模为1时,划分结束 从规模1到n/2,陆续归并被排好的两个数组,每归并一次,数组规模扩大一倍,直到原始数组

Hanoi塔的递归算法

设计思想 将原问题归结为规模为n-1的2个子问题 继续规约,当子问题规模为1时,归约过程截止 从规模1到n-1,陆续组合两个子问题的解,直到规模为n

小结

将原问题归约为规模小的子问题,子问题与原问题具有相同的性质 子问题规模足够小时可直接求解 算法可以递归也可以迭代实现 算法的分析方法:递推方程

分治算法的一般描述和分析方法

Divide-and-Conquer(P) if |P| <= c then S(P) divide P into P1, P2, ...,Pk(划分) for i<--1 to k     yi <--Divide-and-Conquer(Pi)(求解子问题) Return Merge(y1, y2, ..., yk)(综合解) 

设计要点

原问题可以划分或者归约为规模较小的子问题 子问题与原问题具有相同的性质 子问题的求解彼此独立 划分时子问题的规模尽可能均衡 子问题规模足够小时可直接求解 子问题的解综合得到原问题的解 算法实现:递归或迭代 两类递推方程 迭代法、递归树 迭代法、换元法、递归树、主定理

芯片测试

输入:

n片芯片,其中好芯片至少比坏芯片多1片

问题:

设计一种测试方法,通过测试从n片芯片中挑出1片好芯片

要求:使用最少的测试次数

快速排序

最坏情况

最好情况

幂乘算法及应用

Fibonacci O(logn)

Fn+1 Fn 1 1 ^n

Fn Fn-1 1 0

改进分治算法的途径1:减少子问题数

利用子问题的依赖关系,使某些子问题的解通过组合其他子问题的解而得到 整数位乘问题

矩阵相乘问题,Strassen矩阵乘法

Coppersmith-Winograd:O(n2.376)

小结

适用于:子问题个数多,划分和综合工作量不太大

改进分治算法的途径2:增加预处理

平面点对问题

输入:平面点集P中有n个点,n>1

输出:P中的两个点,其距离最小

W(n) = aW(n/b) + f(n)


Read full article from 分治策略 | Algorithm


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts