Подтвердить что ты не робот

Найти самый длинный пробег последовательных целых чисел в векторе

У меня есть подпрограмма, которая возвращает список целых чисел в виде вектора.

Эти целые числа поступают из групп последовательных чисел; например, он может выглядеть так:

vector = 6 7 8 12 13 14 15 26 27 28 29 30 55 56

Обратите внимание, что выше, есть четыре "пробега" чисел (6-8, 12-15, 26-30 и 55-56). То, что я хотел бы сделать, - перевести самый длинный "пробег" чисел на новый вектор. В этом случае это будет запуск 26-30, поэтому я хотел бы создать:

newVector = 26 27 28 29 30

Этот расчет должен выполняться много, много раз на разных векторах, поэтому более эффективно я могу сделать это лучше! Любая мудрость будет с благодарностью воспринята.

4b9b3361

Ответ 1

Вы можете попробовать следующее:

v = [ 6 7 8 12 13 14 15 26 27 28 29 30 55 56];

x = [0 cumsum(diff(v)~=1)];

v(x==mode(x))

В результате получается

ans =

    26    27    28    29    30

Ответ 2

Вот решение, чтобы получить мяч.,

vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56]
d = [diff(vector) 0]


maxSequence = 0;
maxSequenceIdx = 0;
lastIdx = 1;

while lastIdx~=find(d~=1, 1, 'last')

    idx = find(d~=1, 1);
    if idx-lastIdx > maxSequence
        maxSequence = idx-lastIdx;
        maxSequenceIdx = lastIdx;
    end

    d(idx) = 1;

    lastIdx=idx;
end

output = vector(1+maxSequenceIdx:maxSequenceIdx+maxSequence)

В этом примере команда diff используется для поиска последовательных номеров. Когда числа являются последовательными, разница равна 1. Затем цикл while используется для поиска самой длинной группы из них, и индекс этой последовательной группы сохраняется. Тем не менее, я уверен, что это можно было бы оптимизировать дальше.

Ответ 3

Без циклов - должно быть быстрее

temp = find ( ([(vector(2:end) - vector(1:end-1))==1 0])==0);
[len,ind]=max(temp(2:end)-temp(1:end-1));
vec_out =  vector(temp(ind)+1:temp(ind)+len)

Ответ 4

Без циклов с использованием diff:

vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56];

seqGroups = [1 find([1 diff(vector)]~=1) numel(vector)+1]; % beginning of group
[~, groupIdx] = max( diff(seqGroups));                     % bigger group index

output = vector( seqGroups(groupIdx):seqGroups(groupIdx+1)-1)

выходной вектор

ans = 

    26    27    28    29    30