WQS 二分用来求凸函数在一个给定位置处的函数值。如果一个函数 是凸函数,则有 恒成立。考虑 在 处的切线,表示为一条斜率为 的直线 ,代入点 则得到 。希望对于某一个 求出 。
另一方面,考虑问题 。记 则式子转化为 。求导得到 ,令导数等于 得到驻点 ,又因为 是凸函数,所以这 就是极大值点。因此,。
这说明可以通过求解问题 从而由 同时得到 和 的值,因为 就是这个新函数 的极大值点,而 就是 的极大值。又因为 是凸函数,所以 随着 的增加而单调递减。所以我们可以二分 的值,通过计算 可以知道切点 是在目标位置的左边还是右边,从而缩短查找区间的长度一半。二分结束后,就得到了目标位置处的 值,也可以直接计算出 在目标位置处的函数值了。
TIP
对于定义域和值域都是整数的函数,由于它的差分值一定是个整数,所以可以在整数范围内二分这个 ,而不需要浮点数运算。这样可以避免精度问题。
WQS 二分实际上实现的是从单个点处的性质到整体的性质的转化。最常见的问题就是从 个数里恰好选出 个,求最小代价。恰好选出 个可能不是那么好算,使用 WQS 二分就可以转化成从 个数里选出任意个,求最小代价。