Поиск непрерывных подмассивов в Excel - вариация алгоритма Кадане? - PullRequest
1 голос
/ 21 апреля 2020

Предположим, у вас есть упорядоченный, проиндексированный список положительных значений. Эти положительные значения прерываются на 0 значений. Я хочу определить, существует ли последовательный подмассив, который не прерывается 0 значениями и сумма которого превышает определенный порог.

Простой пример:

Index, Value
0   0
1   0
2   3
3   4
4   2
5   6
6   0
7   0
8   0
9   2
10  3
11  0

В приведенном выше примере самый большой последовательный подмассив, не прерываемый 0, находится в диапазоне от индекса 2 до индекса 5 включительно, и сумма этого подмассива составляет 15.

Таким образом, для следующих пороговых значений 20 , 10 и 4, результаты должны быть FALSE, TRUE и TRUE соответственно.

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

Я подозреваю, что эта проблема является вариацией алгоритма Кадане, но я не могу понять, как его настроить.

Дополнительным осложнением является то, что мне нужно выполнить этот анализ в Excel или Google Sheets, и я не могу использовать для этого скрипты - только встроенные формулы.

Я не уверен, что это вообще возможно, но я был бы благодарен за т любой вход.

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Начните с

=B2

в c2

, затем поместите

=IF(B3=0,0,B3+C2)

в C3 и скопируйте вниз.

enter image description here

РЕДАКТИРОВАТЬ 1

Если вы искали решение для листов Google, попробуйте что-то вроде этого:

=ArrayFormula(max(sumif(A2:A,"<="&A2:A,B2:B)-vlookup(A2:A,{if(B2:B=0,A2:A),sumif(A2:A,"<="&A2:A,B2:B)},2)))

Предполагается, что числа в столбце B начинаются с нуля: нужно добавить Iferror, если нет. Это в основном реализация формулы массива для метода @ Гэри-студента.

РЕДАКТИРОВАТЬ 2

Вот формула Google Sheets, переведенная обратно в Excel. Это дает вам альтернативу, если вы не хотите использовать Смещение:

=MAX(SUMIF(A2:A13,"<="&A2:A13,B2:B13)-INDEX(SUMIF(A2:A13,"<="&A2:A13,B2:B13),N(IF({1},MATCH(A2:A13,IF(B2:B13=0,A2:A13)))))) 

(вводится как формула массива).

Комментарий

Возможно, настоящая проблема заключается в том, чтобы найти формулу, которая работает как в Excel, так и в Google, потому что:

  • Vlookup не работает так же, как в Excel
  • Смещение / промежуточная сумма не работает в листах Google
  • Индекс / комбинация с n (если {1} ... не работает в листах Google.
1 голос
/ 21 апреля 2020

С данными в столбцах A и B , страховать столбец B , заканчивающийся 0. Затем в C2 введите:

= ЕСЛИ (И (B3 = 0, B2 <> 0), СУММА (B $ 1: $ B2) -МАКС ($ C $ 1: C1), "")

и копировать вниз:

enter image description here

Столбец C перечисляет суммы последовательных ненулей. В другой ячейке введите что-то вроде:

=MAX(C:C)>19

, где 19 - это значение критерия.

Вы можете избежать столбца "помощник" используя VBA UDF.

EDIT # 1:

Используйте это вместо:

=IF(AND(B3=0,B2<>0),SUM(B$1:$B2)-SUM($C$1:C1),"")
0 голосов
/ 22 апреля 2020

Спасибо @Tom Sharpe и @Gary's Student за ответ на вопрос.

Хотя я, правда, не указал это в вопросе, я бы предпочел найти решение без вспомогательной колонки, потому что мне нужно сделать эта операция на 30+ последовательных столбцов. Я просто не думал, что это возможно в Excel.

Полный кредит отдается пользователю XOR LX в Excelforum за разработку этого решения . Это взорвало мой разум и заняло у меня больше часа, чтобы обернуть голову, но это, безусловно, очень креативно. Я никак не мог придумать это сам. Повторно разместите его здесь для блага всех, кто изучает это.

Скопируйте и вставьте таблицу из моего первоначального вопроса в пустой лист Excel, чтобы заголовки отображались в (A1:B1), а значения отображались в (A2:B13).

Затем введите эту формулу в виде формулы массива (ctrl + shift + enter), которая дает максимум сумм всех непрерывных подмассивов:

=MAX(SUBTOTAL(9,OFFSET(B2,A2:A14,,-FREQUENCY(IF(B2:B13,A2:A13),IF(B3:B14=0,A2:A13,0))-1)))

Обратите внимание на преднамеренное смещение, включающее одну дополнительную строку ниже конца набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...