边界优化

来源:互联网 发布:剑三毒哥捏脸数据图片 编辑:程序博客网 时间:2024/06/08 02:50

原文标题:Using bounds for optimization

原文作者:Andrew Koenig

原文链接:http://dobbscodetalk.com/index.php?option=com_myblog&show=Using-bounds-for-optimization.html&Itemid=29

 

      我意识到,最近碰到的一项优化技术我已经看到过很多次了,但是我几乎从没有看到过对这项技术的明确说明。本文试图来弥补这个不足。

      假设你要查找数组中的最小元素。除非数组排过序,否则你只能检查每个元素并记录下迄今为止你所看到过的最小值,而没有更好的办法。

      现在我们让问题变得复杂点:你有一个二维的无符号整形数组,你想要找到具有最小和的那一行。当然,你可以使用类似的方法,计算每行元素之和并记录下值最小的那一行。然而,只要意识到,当你计算每行元素之和的时候,只要和的值超过了当前的最小值就可以停止,你通常就可以让程序更快。

      这项技术的一般形式就是,假如我们可以对期望得到的计算结果加上约束,这样只要结果不满足约束,我们就可以拒绝做任何更多的事情。

      另外一个例子,假设程序知道地图上所有加油站在哪里,并试图找到距给定点车程距离最小的一家。总的来说,两点间的车程距离是难以计算的——但是我们肯定知道车程距离不可能比直接距离小——也就是两点间的直线距离。

      因此,当我们寻找加油站时,我们可以通过计算直接距离开始;假如直接距离大于当前的最小车程距离,我们就没有必要再计算到现在加油站的车程距离,因为我们知道它不可能是最小的。

      字符串实现有时使用有关的技术来实现比较。如果不同长度的字符串被定义为不相等,那么相等的比较可能应该从长度的比较开始。进行长度的比较不但可以避免字符串长度不一样时的昂贵计算,而且可以让接下来的比较更容易,因为我们知道比较是在长度一样的情况下才进行的。

      最后,值得注意的是,类似的优化已经广泛应用于电子游戏的程序,在那里被称为alpha-beta剪枝。思想是,评价移动X,你不需要考虑所有你对手的反应,只要你发现了一个比移动Y后你对手的最佳反应要好的反应,你就不需要再考虑X,因为移动Y对你来说总是更好的。

      随着计算的复杂化,这种优化的价值变得更清楚。因此,应用领域应该是那些不太清楚的地方——如中等复杂度计算——因为那是你最有可能忽视的地方。

原创粉丝点击