Binary Search 《二分查找》 3

来源:互联网 发布:dbc2000数据库64 编辑:程序博客网 时间:2024/04/28 08:25

 

例子

        在这里我将演示怎么运用我们所讨论的来解决一个Topcoder问题。为了这个我选择了一个难度适中的题目,FairWorkload,是在SRM169div1level2的。

        对于这个问题,许多工人需要检查很多档案橱柜。这些橱柜不都是相同的大小的,我们知道每个橱柜可以容纳几个文件夹。题目要求我们找到一个安排能够使每个工人所检查文件夹的最大数量最小,并且一个工人的检查橱柜必须是相邻的。

        在熟悉了这个问题之后,需要一点点创造里。设想我们我们可以支配的工人的数量是没有限制的。关键的是,对于对于一些数MAX,我们可以计算我们所需要用来检测最小的工人数量使得每个工人检查不超过MAX数量的文件夹(如果有)。现在来看怎么实现它。一些工人需要检查第一个橱柜,所以我们派任意一个工人去。但是因为橱柜必须按照顺序来分配(一个工人不能检查检查13而跳过2),把第二个橱柜分配给他也是必须的,如果假如不查过前边的限度(MAX)。如果超过了限度,那么我们就让他做这些工作,让另外一个人去检查第二个橱柜。我们像这样一直处理,知道所有的橱柜都被分配且可以断定我们使用了最少的工人,在我们假设的限制下。在这里注意到工人的数量和MAX成反比:限度越高,我们需要的工人越少。

        现在,如果你再回过头,仔细在问题的叙述中我们还需要什么,我们要知道最小的MAX,它要比可用的工人数量要少或者相等。有了这些之后,我们就基本上解决了问题,我们要做的是联系起来看怎么才满足这个我们使用二分搜索来解决的框架。

        当重新理解来满足我们需要之后,我们可以检查这个断言“工作量被分配后每个工人检查不超过x的文件夹,在可用工人数量的限制下?”这就得到了二分搜索解决的第一部分。我们现在需要证明它满足主要理论。但是观察到增加x实际上是放松了最大工人的数量的限制,所以我们我们可以获得相同或者更少的工人。因此,如果这个断言得出yesx下,它也会得到yes对于所有大于x的值。

完成代码,这里是使用STL来解决这个问题的片段:

        注意要仔细选择上界和下界:你可以用充分大的整数来代替上界,但是下界必须不能够比最大的橱柜少来避免一个橱柜都不能被任何一个工人检查的情形,这种情况不能那个被这个断言正确的处理。一个选择是把下界设置为0,然后在断言中单独处理特别小的x

为了证实这个解决方案不会死循环,我使用一个小的no/yes例子文件夹为{1,1}工人数量为1

        整体的时间复杂度是O(n log SIZE),这里SIZE是搜索空间的大小。这是相当快的了。

        你所看到的,我们用贪心来处理断言。在其他问题中,处理断言可以为一个简单的数学表达式来找到最大基数的二部图匹配。

总结

        如果你学习这个是没有放弃,你应该准备好解决任何可以用二分搜索的题目。试这把下面的事情记住:

        设计一个能够被二分搜索调用的搞笑的断言

        决定你要什么和编写什么,那样搜索空间才一直有(如果有的话)

        如果搜索空间由整数组成,用两个数的测试用例来检查是否会死循环

        证明上界和下界不超过限制:最好放宽,只要不违背断言

 

原创粉丝点击