LINUX.ORG.RU

Подскажите алгоритм поиска скопления чисел с малыми промежутками в отсортированном массиве

 


0

2

Подскажите алгоритм.

Есть массив чисел, по возрастанию со случайными промежутками. Сначала промежутки большие, в какой-то момент будет группа чисел с небольшим промежутком, потом снова большие промежутки.

Мне нужно найти начало и конец скопления.

На примере будет понятнее

[
1,30, 70, 200, 250, /* Это случайные */ , 
401, 403, 410, 415, 425, 426, 430, 434 /* Это скопление */, 
500, 650, 700, 1000 /* Это случайные */
]

Некоторая информация 1) Скопление только одно, промежутки между цифрами в скоплении на уровне 0-10, промежутки не в скоплении могут быть любыми, грубо говоря 0-1000 2) Производительность меня пока что не интересует, потребляемая память тоже. Писаться алгоритм будет на js 3) Идеального результата не надо, я понимаю что алгоритм будет эврестический - это ОК

★★★

Хм, идёшь по массиву, считаешь разницу с предыдущим элементом. Как только разница стала <10 это начало скопления. Как только после начала разница стала >10 это конец скопления. Вроде бы всё очевидно, в чём подвох?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Я вот щас так и пробую, только вместо сравнение текущего и следующего сравниваю через 3

for(let i = sorted.indexOf(bestResultMiddle.wordIndex); i >= 3; i--) {
    if (sorted[i] - sorted[i - 3] > 15) {
      low = sorted[i];
      break;
    }
  }

  for(let i = sorted.indexOf(bestResultMiddle.wordIndex); i < sorted.length - 3; i--) {
    if (sorted[i + 3] - sorted[i] > 15) {
      end = sorted[i];
      break;
    }
  }

Щас в процессе тестирование как оно работает.

Вроде бы всё очевидно, в чём подвох?

Та там везде рандом, промежутки не обязательно будут такими.

abs ★★★
() автор топика
Ответ на: комментарий от abs

промежутки не обязательно будут такими

Ну можно сначала посчитать величину стандартного отклонения для разницы и от этого плясать.

Кроме того можно фиксировать все срабатывания и брать наибольшее по диапазону индексов.

no-such-file ★★★★★
()

Подпоследовательность максимальной длины с промежутками не больше 10, находится линейно за один проход.

slovazap ★★★★★
()

Если дисперсия в выборке заранее неизвестна, можно использовать простейшую кластеризацию типа k means. И выбирать кластеры с высокой локальностью.

CatsCantFly
()

Конвертишь свой массив в дельточки от предыдущего и далее в один проход считаешь длины участков с допустимым отклонением. Для большей чувствительности можно сделать допуски.

AlexAT
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.