次の問題に対して、実行時間O(nlogn)のアルゴリズムを設計する必要があります。
n個の点のセットPが与えられた場合、せん断変換(x、y)->(x + Ay、y)がx座標が等しくない点の順序(x方向)を変更しないように、値A>0を決定します。 。
どこから始めればいいのかわからなくても大変です。
これに関する助けをいただければ幸いです。
ありがとうございました!
次の問題に対して、実行時間O(nlogn)のアルゴリズムを設計する必要があります。
n個の点のセットPが与えられた場合、せん断変換(x、y)->(x + Ay、y)がx座標が等しくない点の順序(x方向)を変更しないように、値A>0を決定します。 。
どこから始めればいいのかわからなくても大変です。
これに関する助けをいただければ幸いです。
ありがとうございました!
私はy=0だと思います。
When x = 0, A > 0
(x,y) -> (x+Ay,y)
-> (0+(A*0),0) = (0,0)
When x = 1, A > 0
(x,y) -> (x+Ay,y)
-> (1+(A*0),0) = (1,0)
x座標が等しくない、(2,0)、(3,0)、(4,0)...なので、始点は(0,0)、x=0でよいと思います。
わかりました、ここでメソッドを大まかに突き刺します。
ポイントのリストを x 順で並べ替えます。(これにより O(nlogn) が得られます。これ以降のすべてのステップは O(n) です。)
x 座標間の差 dx_i = x_(i+1) - x_i の新しいリストを生成します。x_i が順序付けられているため、これらの dx_i はすべて >= 0 です。
ある A の場合、変換された dx_i(A) は x_(i+1) -x_i + A * ( y_(i+1) - y_i) になります。これが負またはゼロの場合 (x_(i+1)(A) < x_i(A))、次数が変更されます。
したがって、各 dx_i について、dx_i(A) をゼロにする A の値、つまり A_i = - (x_(i+1) - x_i)/(y_(i+1) - y_i) を見つけます。これで、連続する (x オーダーの) ペアのポイント間でオーダー スワップを「引き起こす」係数のリストができました。ゼロ除算に注意してください。ただし、2 つの点の y が同じ場合は、これらの点の順序は変わりません。A_i の一部は負になるため、A>0 の場合はこれらを破棄します。(負の A_i もオーダー スワップを誘発するため、A>0 の要件は少し恣意的です。)
リストで最小の A_i > 0 を見つけます。したがって、0 < A < A_i(min) の A は、ポイントの順序を変更しないせん断になります。A_i(min) を選択すると、2 つの点が同じ x に移動しますが、互いに通り過ぎません。
すべての x、y 座標が正の数であるとします。(一般性を失うことなく、オフセットを追加できます。) 時間 O(n log n) で、ポイントのリスト L を、主に x 座標の昇順で、次に y 座標の昇順で並べ替えます。時間 O(n) で、点のペアを (L の順序で) 次のように処理します。p、q を L 内の任意の 2 つの連続する点とし、px、qx、py、qy をそれらの x および y 座標値とする。そこから、いくつかのケースを検討する必要があるだけで、何をすべきかは明らかです。px=qx の場合、何もしません。それ以外の場合、py<=qy の場合は何もしません。Else (px>qx, py>qy) の場合、px + A*py < qx + A*qy、つまり(px-qx)/(py-qy) > Aが必要です。
したがって、L を順番に調べて、px>qx および py>qy であるすべての点のペアで満たされる最大の A' を見つけます。次に、A' より少し小さい A の値、たとえば A'/2 を選択します。(または、問題の目的がそのような最大の A を見つけることである場合は、単に A' 値を報告します。)