Учитывая список массивов и много времени установки, мне нужно быстро найти наименьшее значение в некотором подпространстве каждого массива. В концепции:
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
}
}
В настоящее время я думаю о том, как это сделать, чтобы построить двоичное дерево данных, где каждый узел содержит минимум в соответствующем интервале. Таким образом, нахождение минимума в промежутке для одной строки будет состоять из нахождения минимума только тех узлов дерева, которые его составляют. Этот набор будет одинаковым для каждой строки, поэтому может быть вычислен один раз.
Кто-нибудь видит какие-либо проблемы с этой идеей или знает лучшие способы?
Для пояснения, дерево, о котором я говорю, будет создано таким образом, чтобы корневой узел содержал значение min для всей строки, а для каждого узла его левый потомок имел значение min для левой половины родительский промежуток и то же самое для права.
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
Это дерево может быть сопоставлено с массивом и определено таким образом, что границы сегментов могут быть вычислены, что приводит к быстрому поиску.
Я оптимизирую ситуацию, когда у меня есть фиксированный набор входных данных и много времени для начала, но затем мне нужно сделать много быстрых тестов на нескольких диапазонах.