Предположим, у нас есть k последовательностей фиксированной длины p . Каждая последовательность имеет двойные значения в диапазоне от 0 до 1.0 . Для простоты предположим также, что последовательности являются просто массивами; в реальной реализации они будут списком.
Теперь алгоритму необходимо найти наименьший индекс, значение которого представляет «серьезное расстройство» в данной последовательности. Это расстройство может быть значением 1,0 или значением, превышающим определенный порог (например, 0,2 ). Если, например, при переходе от j-1 к j значение превышает пороговое значение, то искомый индекс будет j-1 . * 1021. *
Расстройство 1,0 имеет приоритет над пороговым значением; например, если мы найдем индекс, соответствующий порогу, мы все равно должны проверить последовательность на наличие 1.0 .
Наконец, алгоритм должен выдавать наименьший индекс, который привел к расстройству.
Я быстро собрал некоторый код, чтобы проверить концепцию и показать вам, что мне нужно. То, что я ищу, - это, возможно, более эффективная реализация, поскольку этот алгоритм будет выполняться довольно широко.
List<double[]> nearCaptures = new ArrayList<double[]>();
double threshold = 0.2;
double majorUpset = 1.0;
int[] indexes = new int[nearCaptures.size()];
for (int i = 0; i < nearCaptures.size(); i++) {
int index = 0;
double[] tempArray = nearCaptures.get(i);
Arrays.sort(tempArray);
int tempIndex = Arrays.binarySearch(tempArray, majorUpset);
if (tempIndex > 0) {
for (int j = 1; j < nearCaptures.get(0).length; j++) {
if (nearCaptures.get(i)[j] == majorUpset) {
index = j-1;
break;
}
}
} else {
for (int j = 1; j < nearCaptures.get(0).length; j++) {
if (nearCaptures.get(i)[j] >= nearCaptures.get(i)[j-1] + threshold) {
index = j-1;
break;
}
}
}
indexes[i] = index;
}
Arrays.sort(indexes);
System.out.println(indexes[0]);