OK、これが取引です。私は一次関数a*x+bをたくさん持っています。
私の目標は、次の質問/クエリに答えることです。x = qでの最小関数は何ですか?
例:関数f(x)= 3 * x + 2、g(x)= 5 * x -6およびh(x)= 2 * x + 1がある場合、次のように答えます。
x = 4の場合、関数h
x = 2の場合、関数g
x = 1の場合、関数g
私の考えは次のようになります。
関数をxの係数で降順で並べ替えます。
クエリを昇順で並べ替えます
並列関数を取り除き、定数項が最小の関数を保持します(たとえば、f(x)= 2 * x + 4およびg(x)= 2 * x + 2の場合、f(x)は決してなりませんg(x)よりも小さいので、f(x)は必要ありません。
現在、私は-infから実数までの区間にいます。これをw1と呼びます。この区間では、線形係数が最も高い関数が最小であることがわかります。
最小のx1stf(x1)= g(x1)を見つけてw1を見つけます。ここで、fは現在の関数であり、gは他のすべての関数をより小さな線形係数w1=x1で繰り返します。
クエリが区間(-inf、w1)にある限り繰り返します。現在の関数を出力してから、次のクエリに進みます。
回答が必要なクエリがまだある場合は、現在の関数をx = w1で実際の現在の関数と交差するものとし、-infputw1の代わりに同じ手順を繰り返します。
しかし、私の実装やアイデアは十分に速くありません。私のプログラムをスピードアップするかもしれないことに気づかなかったものはありますか?
前もって感謝します。