- ベストアンサー
複数の範囲を通る直線の求め方について
- 複数の範囲を通る直線の求め方についての質問です。上限のグラフと下限の折れ線グラフが与えられていますが、その上限と下限の中を通る直線の式(y=ax+b)を求めたいという要望です。可変点の数や存在しない場合の処理など、具体的な条件が挙げられています。
- Javaでプログラムを作成し、機械的に解きたいと考えている方からの質問です。複数の範囲を通る直線の式を求める解法についてのアイデアや考えが求められています。また、上限と下限の中を通る直線が存在しない場合の処理についても言及されています。
- 複数の範囲を通る直線の式を求めたいという要望を持つ方からの質問です。可変点の数や直線の傾きの絶対値が最も小さい直線を求める条件が挙げられています。Javaでの実現方法についてのアイデアや解法が求められています。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
nのオーダーで計算する方法です。 まず、凹点を除きます。 残りの点だけでグラフを作ると、凸グラフになります。(正確には、下限は上に凸、上限は下に凸) この2つの凸グラフが重なっていれば中を通る直線は存在しません。 重なっていなければ中を通る直線は必ず存在します。 重なっているかどうかの判定まではnのオーダーで計算できます。 以下は、凹点を除いた凸グラフで、2つの凸グラフが重なっていないとします。 下限の凸グラフの点がk個だとすると、グラフの直線はk-1本。 まず、そのk-1本が中を通るかどうかを判定します。 中を通る直線が存在した場合は、そのうちの絶対値が最小の傾きの直線を求めます。 で、その直線を定めた2点の大きい方の点と、上限の点を結んだ直線のうち、中を通るもので傾きの絶対値が最小の直線が求める直線となります。 ただし、下限の点が下限の最大値の場合は、傾き0の直線についても中を通るかどうか判定します。 ここまでもnのオーダーで計算できます。 下限の凸グラフのk-1本の直線が全て中を通らない場合は、 下限の左側の直線から調べていったとして、 はじめのうちは、2点の右側で枠外になっていて、ある時点から2点の左側で枠外になり、それ以降はずっと左側で枠外になります。 つまり、枠外になるのが右側から左側に変わる境界点がただ1つ存在します。(左右両方とも枠外になることはない) で、その境界点と上限の点を結んだ直線のうち、中を通るもので傾きの絶対値が最小の直線が求める直線となります。 これも、境界点が下限の最大値の場合は、傾き0の直線についても中を通るかどうか判定します。 これもnのオーダーで計算できますから、全体でもnのオーダーで計算できるはずです。 ただし、直線が中を通るかどうかの判定方法にも#5で書いたような工夫が必要だと思います。 あと、計算量をできるだけ少なくしたいなら、調べる直線の順番を傾きの絶対値が小さい順にすることでしょうか。 #7さんへ 端短,Um,Bmどれも通らない直線が求める直線になる場合もありますから、結局は全ての2点を通る直線が候補になります。
その他の回答 (11)
- nag0720
- ベストアンサー率58% (1093/1860)
X=1,2,・・・,n とすると、点の数は2n個 中を通る直線があるとすれば、それは2n個のうちの2個の点を通るとしてよい。 なので、高々n(2n-1)本の直線を調べればいいのでは。
お礼
回答ありがとうございます! 回答頂いて気づいたのですが、複数の線が存在したときの切片の条件がありませんでした。 切片の条件は最も小さいものとしたいと思います。 それで例えば載せた図で上限が80一定だった場合、x=3の下限の点1点のみを通る傾き0の直線になると思います。 つまり必ず2点は通らないのです。 回答を参考にもう少し考えてみます。
補足
複数の線が存在したときの切片の条件がありませんでした。 切片の条件は最も小さいものとしたいと思います。
- 1
- 2
お礼
これ本当にnのオーダーで出来んの?と思ったら各ステップ毎に検査範囲が狭められていて恐れ入ります。 アルゴリズムレベルまで落としていただいて申し訳ありません。 で、済みませんが説明がよく分からない部分がありまして、「枠外」とはどんなことでしょうか? > 下限の左側の直線から調べていったとして、 から4行分が分かりません。 下限の左側の直線というのは下限のx=1とx=2の直線のことですか?