解空间树

分治法

  • 分解(Divide)步骤将问题分解为一些子问题,子问题的形式与原问题一样,只是规模更小
  • 解决(Conquer)步骤递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解
  • 合并(Combine )步骤将子问题的解组合成原问题的解

引用自《算法导论》

通常的遇到的需要分治法解决的问题只需要一维的分解,比如解决斐波那契数列问题
1.1 动态规划:斐波那契数
关于斐波那契数列的分治法的解空间树

解空间树:是依据待解决问题的特性,用树结构表示问题的解结构、用叶子表示问题的解的一颗树。

但有些问题需要进行二维的分解。其原因在于将父问题分解为子问题的切分点有多个,而不是像斐波那契问题那样有唯一的切分点。通常每个切分点对合并阶段都有影响。比如
241. 为运算表达式设计优先级

graph TB subgraph "f(2*3-4+5)=[8,-12,-3,7,3]" id0(2*3-4+5) end subgraph "f((2)*(3-4+5))=[8,-12]" id0-->id1(2) id0-->id2(3-4+5) subgraph "f(3-4+5)=[4,-6]" id2 end subgraph "f((3)-(4+5))=[-6]" id2-->id7(3) id2-->id8(4+5) id8-->id15(4) id8-->id16(5) end subgraph "f((3-4)+(5))=[4]" id2-->id9(3-4) id9-->id25(3) id9-->id26(4) id2-->id10(5) end end subgraph "f((2*3)-(4+5))=[-3]" id0-->id3(2*3) id0-->id4(4+5) id3-->id17(2) id3-->id18(3) id4-->id19(4) id4-->id20(5) end subgraph "f((2*3-4)+(5))=[7,3]" id0-->id5(2*3-4) id0-->id6(5) subgraph "f(2*3-4)=[2,-2]" id5 end subgraph "f((2)*(3-4))=[-2]" id5-->id11(2) id5-->id12(3-4) id12-->id21(3) id12-->id22(4) end subgraph "f((2*3)-(4))=[2]" id5-->id13(2*3) id13-->id23(2) id13-->id24(3) id5-->id14(4) end end

动态规划通常有两种实现方式,分支+记忆填表

五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

posted @ 2022-03-24 09:59  Tifa_Best  阅读(857)  评论(0编辑  收藏  举报