Разбить массив чисел на несколько частей с близкими значениями

#arrays #collections

#массивы #Коллекции

Вопрос:

Пример массива:

 [
    1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30
]
  

Мне нужно, чтобы он разделился на три части с близкими значениями

 [1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]
  

Массив может быть разным, но логика одна и та же. Может ли кто-нибудь предложить какой-либо подход (математическую модель, теорию, распределение или и т. Д.) Для этого?
введите описание изображения здесь

Комментарии:

1. Под «близкими» значениями вы подразумеваете последовательные, я предполагаю. Должны ли числа быть в порядке внутри массива или вы могли бы иметь [1,9,2,3,8] и возвращать [1,2,3] и [8,9] ?

2. Нет, массив всегда сортируется по asc

3. Начните с первого элемента, N, и посмотрите, равен ли следующий элемент N 1. Если это произойдет, добавьте его в массив. Если нет, поместите это число в новый массив и повторите. (вы можете использовать 2D-массив для создания этого)

Ответ №1:

Термин «разделить массив с близкими значениями» неоднозначен.

Вы можете проверить, находится ли разница между двумя последовательными значениями в определенном диапазоне. Если разница находится в указанном диапазоне, то вы можете добавить текущее значение в текущий вложенный список. Еще вам нужно добавить в следующий список:

 prev = 0
cnt = 1

for elm in A:
    if elm - prev not in range(0, 5):
        cnt  = 1
    add_to_sub(cnt, elm)
    prev = elm
  

cnt переменная используется для определения, в какой подсписок мы должны добавить значение. Для вопроса я установил диапазон между 0-5. Это означает, что если разница больше или равна 5, добавьте текущее значение в следующий вложенный список.

Код:

 A = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30]

sub1 = []
sub2 = []
sub3 = []

prev = 0
cnt = 1


def add_to_sub(count, element):
    if count == 1:
        sub1.append(element)
    elif count == 2:
        sub2.append(element)
    else:
        sub3.append(element)


for elm in A:
    if elm - prev not in range(0, 5):
        cnt  = 1
    add_to_sub(cnt, elm)
    prev = elm

print(sub1)
print(sub2)
print(sub3)
  

Результат:

 [1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]
  

Ответ №2:

Поскольку все значения в исходном массиве уже отсортированы, это упрощает задачу.

В вашем примере я скажу, что есть 3 решения.

 solution 1: [1, 2, 3]
solution 2: [10, 11, 12, 13, 14]
solution 3: [20, 21, 22, 30]
  

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

Возьмите первое значение из источника и начните создавать решение 1. Теперь перебираем оставшиеся значения в источнике. Если следующее значение следует за самым последним значением, добавленным в текущем решении, добавьте его в этот набор решений. Если нет, начните создавать новое решение.

 source = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30];
solutions = new Array(1);

index = 0;
solutions[index] = new Array();
solutions[index].push(source[0]);

j = 0;
for (i = 1; i < source.length; i  ){

    if (solutions[index][j] 1 == source[i]){
        solutions[index].push(source[i]);
        j  
    }else{
        solutions.push(new Array());
        index  ;
        solutions[index].push(source[i]);
        j = 0;
    }
}

console.log(solutions);