对于一些存在数量庞大的子问题的问题,我们可以强制预测答案结构。所谓预测答案结构,即是寻找可行的答案中可能存在的 pattern,也即规律。

比如序列的量化问题,将小于 1000 的自然数组成的序列量化成 s 个自然数组成的序列,且要求最终的误差平方和最小。比如,把序列{1 2 3 4 5}量化成{2 2 4 4 4}(s = 2)。

该问题其实蕴含着丰富的子问题,对着这种具有庞大子问题的问题,我们就可以采用强制预测答案结构的方式进行。

  • 对于给定序列,那么被相同数值量化的数值一定相邻

例如,量化 {1, 2, 3, 4}时,像{2, 2, 3, 2}形式的答案不可能是最优解。明白了这点,就等于找到了解决此问题的方法:

  • 首先对给定序列排序,
  • 然后采用适当方式分割出相邻数值组成的数值快;
  • 用相应数值表示每个数值快就可以得到最小误差;

  • {1, 4, 6, 744, 755, 777, 890, 897, 902}{{1, 4, 6}, {744, 755, 777}, {890, 897, 902}}

通过以上步骤,原题就变成“把给定序列分割成 s 个数值快”的问题。显然这种问题采用递归调用的方式就可轻松解决,自然每次递归调用时决定第一个数值快的大小。

posted on 2016-09-09 16:08  未雨愁眸  阅读(139)  评论(0编辑  收藏  举报