WQS 二分用来求凸函数在一个给定位置处的函数值。如果一个函数 是凸函数,则有 恒成立。考虑 处的切线,表示为一条斜率为 的直线 ,代入点 则得到 。希望对于某一个 求出

另一方面,考虑问题 。记 则式子转化为 。求导得到 ,令导数等于 得到驻点 ,又因为 是凸函数,所以这 就是极大值点。因此,

这说明可以通过求解问题 从而由 同时得到 的值,因为 就是这个新函数 的极大值点,而 就是 的极大值。又因为 是凸函数,所以 随着 的增加而单调递减。所以我们可以二分 的值,通过计算 可以知道切点 是在目标位置的左边还是右边,从而缩短查找区间的长度一半。二分结束后,就得到了目标位置处的 值,也可以直接计算出 在目标位置处的函数值了。

TIP

对于定义域和值域都是整数的函数,由于它的差分值一定是个整数,所以可以在整数范围内二分这个 ,而不需要浮点数运算。这样可以避免精度问题。

WQS 二分实际上实现的是从单个点处的性质到整体的性质的转化。最常见的问题就是从 个数里恰好选出 个,求最小代价。恰好选出 个可能不是那么好算,使用 WQS 二分就可以转化成从 个数里选出任意个,求最小代价。