Знаете, я действительно однажды использовал partal_sum () ... Это была небольшая интересная проблема, которую мне задали на собеседовании.Мне это очень понравилось, я пошел домой и закодировал его.
Проблема заключалась в следующем: учитывая последовательную последовательность целых чисел, найдите самую короткую подпоследовательность с наибольшим значением.Например:
Value: -1 2 3 -1 4 -2 -4 5
Index: 0 1 2 3 4 5 6 7
Мы нашли бы подпоследовательность [1,4]
Теперь очевидное решение состоит в том, чтобы запустить с 3 для циклов, повторяя все возможныеначинается и заканчивается, и суммирует значение каждой возможной подпоследовательности по очереди.Неэффективно, но быстро кодируется и сложно ошибиться.(Особенно, когда третий для цикла просто накапливается (начало, конец, 0) .)
Правильное решение включает в себя разделяй и властвуй / снизу вверхподход.Например, разделите проблемное пространство пополам, и для каждой половины вычислите самую большую подпоследовательность, содержащуюся в этом разделе, самую большую подпоследовательность, включающую начальный номер, самую большую подпоследовательность, включающую конечный номер, и подпоследовательность всего раздела.Вооружившись этими данными, мы можем затем объединить две половины без какой-либо дальнейшей оценки одной из них.Очевидно, что данные для каждой половины могут быть вычислены путем дальнейшего разбиения каждой половины на половины (четверти), каждой четверти на половины (восьмые) и так далее, пока у нас не появятся тривиальные единичные случаи.Все это довольно эффективно.
Но, кроме этого, есть третий (несколько менее эффективный) вариант, который я хотел изучить.Это похоже на случай 3-for-loop , только мы добавляем соседние числа, чтобы избежать такой большой работы.Идея состоит в том, что нет необходимости добавлять a + b, a + b + c и a + b + c + d, когда мы можем добавить t1 = a + b, t2 = t1 + c и t3 = t2 + d.Это компромисс между пространством и вычислениями.Он работает путем преобразования последовательности:
Index: 0 1 2 3 4
FROM: 1 2 3 4 5
TO: 1 3 6 10 15
Таким образом, давая нам все возможные подстроки, начиная с индекса = 0 и заканчивая индексами = 0,1,2,3,4.
Затем мыитерируйте по этому набору, вычитая возможные возможные «начальные» точки ...
FROM: 1 3 6 10 15
TO: - 2 5 9 14
TO: - - 3 7 12
TO: - - - 4 9
TO: - - - - 5
, тем самым давая нам значения (суммы) всех возможных подпоследовательностей.
Мы можем найти максимальное значениекаждая итерация с помощью max_element () .
Первый шаг легче всего выполнить с помощью part_sum () .
Остальные шаги с помощью для цикла и преобразования (data + i, data + size, data + i, bind2nd (минус (), data [i-1])) * .
Ясно O (N ^ 2).Но все равно интересно и весело ...