找到两个分段线性函数的交点

时间:2019-02-18 15:19:07

标签: c++

我有两个分段线性函数,一个递增,一个递减。 每个函数都表示为两个双精度数组。这些是函数的坐标。

一个函数可以是(1,2,3)(10,20,30)。另一个函数可以表示为双精度数组(1.5,2.5,3.2)(30,20,15)。我需要编写一个c ++函数来计算这两个单调的分段线性函数的截距。在这种情况下,答案是2.25

我还没有想出一种有效的算法。有什么想法吗?

到目前为止,我想到的方法是遍历整个域。增加1个函数的x轴,并按对求解,但这似乎是一种蛮力方法。有没有办法使用单调性来更快地解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以通过二进制搜索在O(logn 2 )中找到相交的段。

以递增函数F = {f 1 ,f 2 ,... f m }开始,递减函数G = {g 1 ,g 2 ,... g n }。在F的中间某处选择一个点f k ,然后在G中对段{g s ,g s + 1 进行二进制搜索。 >}在x中包含f k

如果f k 在该线段以下,则交点在右侧,问题减少到[{f k ... f m < / sub>},{g s ... n }]。另一方面,如果f k 在该线段上方,则交点位于左侧,问题减少为[{f 1 ... f k < / sub>},{g 1 ... g s + 1 }]。

这是二进制搜索中的二进制搜索,因此可以算出O(logn 2 )。确定一个点在线段的上方还是下方是O(1),找到两个线段的交点(一旦找到)就是O(1)。