配列のリストと多くのセットアップ時間が与えられた場合、各配列の一部のサブスパンで最小値をすばやく見つける必要があります。コンセプト:
class SpanThing
{
int Data;
SpanThing(int[][] data) /// must be rectangulare
{
Data = data;
//// process, can take a while
}
int[] MinsBruteForce(int from, int to)
{
int[] result = new int[data.length];
foreach(int index, int[] dat; Data)
{
result[i] = int.max;
foreach(int v; dat[from .. to]);
result[i] = min(result[i], v);
}
return result;
}
int[] MinsSmart(int from, int to)
{
// same as MinsBruteForce but faster
}
}
これを行う方法についての私の現在の考えは、各ノードが関連するスパンの最小値を含むデータ上にバイナリ ツリーを構築することです。そのようにして、1 つの行のスパンの最小値を見つけることは、それを構成するツリー ノードのみの最小値を見つけることで構成されます。このセットは各行で同じになるため、一度計算できます。
このアイデアに問題があるか、より良い方法が知られている人はいますか?
明確にするために、私が話しているツリーは、ルートノードに行全体の最小値が含まれ、各ノードの左側の子が親のスパンの左半分の最小値を持ち、右も同様。
0 5 6 2 7 9 4 1 7 2 8 4 2
------------------------------------------------
| 5 | 6| | 7 | 9 | | 1 | 7 | 2 | 8 | 4 | 2
0 | 5 | 2 | 7 | 4 | 1 | 2 | 2
0 | 2 | 1 | 2
0 | 1
0
このツリーを配列にマップし、セグメントの境界を計算して検索を高速化できるように定義することができます。
私が最適化しているケースは、入力セットが固定されており、事前に多くの時間を費やしているが、さまざまなスパンで多くの高速テストを実行する必要がある場合です。