我有两个分段线性函数,一个递增,一个递减。 每个函数都表示为两个双精度数组。这些是函数的坐标。
一个函数可以是(1,2,3)(10,20,30)。另一个函数可以表示为双精度数组(1.5,2.5,3.2)(30,20,15)。我需要编写一个c ++函数来计算这两个单调的分段线性函数的截距。在这种情况下,答案是2.25
我还没有想出一种有效的算法。有什么想法吗?
到目前为止,我想到的方法是遍历整个域。增加1个函数的x轴,并按对求解,但这似乎是一种蛮力方法。有没有办法使用单调性来更快地解决这个问题。
答案 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)。