一、概念
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。——百度百科
当然,不变的,我们用一句话来总结分治:大事化小,小事化了。
分治的表面意思是"分而治之",同样因此分治会将一个问题进行分解,拆分成多个子问题,直到能直接解决为止。
在分治当中,最“有名”的就是二分(我们后面会讲)了。
好了,话不多说,来看题。
二、例题
-
1.寻找伪币
题目描述
给你一个装有16枚硬币的袋子。16枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这枚伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,比如天平。利用这台仪器,可以知道两组硬币的重量是否相同。输入格式
一行,包含16个正整数,用空格隔开,每个正整数不大于10, 其中15个数相同,1个数小于其它15个数输出格式
一行,两个数,用空格隔开 第一个数是伪币的输入编号,第二个数是伪币的重量样例输入
2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
样例输出
4 1
题解
其实这道题就只需要一个一个的比较,然后找到最轻的硬币输出就好了……
但是我们在写分治!
所以!让我们用分治的思想来想一想这道题到底该怎么想(?)
我们假设这16枚硬币分别是
A B C D E F G H I J K L M N O P,且假硬币是E
则:天平左 天平右 哪边轻 ABCDEFGH IJKLMNOP 左 ABCD EFGH 右 EF GH 左 E F 左 所以……可以了吗?
我们首先将16枚硬币分成2组,一组8个,接着找到轻的,将它分成2组,每组4颗……直到找到假硬币为止。递归……它出现了!
强势插播:如果递归不太好滴,可以去看一看这篇文章的递归板块。为什么我们会想到这么做?
第一:只有16枚硬币,按照分治的思想,一定会把这些硬币分为多组,然后进行比较。可是分为几组比较合适呢?这里你会发现出题人的心思:
16 / 2 = 8 16/2=8 16/2