3

質問はすでに回答されていますが、私が直面している主な問題は、回答の1つを理解することです..

https://stackoverflow.com/a/1621913/2673063から

次のアルゴリズムはどうO(n)ですか?

最初にポイントを並べ替える/凸包を計算する (O(n log n) 時間) 必要に応じて、多角形に表示される順序で周期的に並べ替えられたポイントを持つ凸多角形/凸包があると仮定できます。ポイントを 1、2、3、…、n と呼びます。(可変) ポイント A、B、および C を、それぞれ 1、2、および 3 として開始します (周期的な順序で)。ABC が最大面積の三角形になるまで、A、B、C を移動します。(この考え方は、直径 (最も遠いペア) を計算するときに使用される回転キャリパー法に似ています。)

A と B を固定して、三角形の面積が増加する限り、つまり、面積(A、B、C) ≤ 面積(A、B、C+1)。この点 C は、固定された A と B の Area(ABC) を最大化する点になります (つまり、関数 Area(ABC) は C の関数として単峰性です)。

次に、B を (A と C を変更せずに) 進めると、領域が増加します。その場合は、上記のように C を進めます。次に、可能であれば B をもう一度進めます。これにより、A を頂点の 1 つとする最大面積の三角形が得られます。(ここまでの部分は簡単に証明できるはずで、これを各 A ごとに単純に行うと O(n2) になります。しかし、読み進めてください。) では、A をもう一度進めて、面積などを改善する場合など。ネストされた" ループでは、B と C は常に "前方" に進み、合計で最大 2n 回進む (同様に A は最大 n 回進む) ため、全体が O(n) 時間で実行されることに注意してください。

4

2 に答える 2

3

質問の主題である回答の作成者として、O(n)ランタイムについてより詳細な説明をする義務があると感じています。


まず、例として、特定のサンプル入力 (12 角形) に対するアルゴリズムの最初の数ステップを示す論文の図を次に示します。最初に、A、B、C を 3 つの連続する頂点として開始し (図のステップ 1)、面積が増加する限り C を進め (ステップ 2 から 6)、次に B を進めます。

サンプルラン

上にアスタリスクが付いた三角形は、「固定された極大値」、つまり、特定の A に最適なものです (つまり、C または B のいずれかを進めると面積が減少します)。


実行時間に関する限り、O(n)B の「実際の」値を、インクリメントされ、ラップ アラウンドを無視する回数に関して nB とし、同様に C を nC とします。(つまり、B = nB % nC = nC % n.) ここで、次のことに注意してください。

  1. (「B は A よりも進んでいます」) A の値がどうであれ、A ≤ nB < A + n

  2. nB は常に増加しています

したがって、A が 0 から n まで変化するとき、nB は 0 から 2n の間でしか変化しないことがわかります。最大で 2n 回インクリメントできます。同様にnC. これは、A、B、および C がインクリメントされる合計回数に比例するアルゴリズムの実行時間が、O(n) + O(2n) + O(2n) によって制限されることを示しています。これは O(n) です。 )。

于 2013-08-26T12:00:04.080 に答える