В области компьютерного программирования и решения алгоритмических задач концепция массива сумм префиксов оказалась мощным инструментом. Являетесь ли вы опытным программистом или только начинаете, понимание и использование массивов сумм префиксов может значительно повысить вашу способность эффективно решать различные типы задач. В этом подробном руководстве мы углубимся в построение и применение массивов сумм префиксов. Итак, давайте углубимся и раскроем потенциал массивов сумм префиксов.

Индекс

  1. Что такое массив сумм префиксов?
  2. Построение массива суммы префиксов
  3. Понимание массива суммы префиксов на примере
  4. Заключение

Что такое массив сумм префиксов?

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

Построение массива суммы префиксов

Чтобы создать одномерный массив суммы префиксов, мы перебираем входной массив и вычисляем кумулятивную сумму для каждого индекса. Значение суммы префикса в индексе i является суммой всех элементов от индекса 0 до i в исходном массиве. Вот шаги, связанные с построением массива суммы префиксов:

  1. Инициализируйте массив, скажем, prefixSum[], такой же длины, как и входной массив.
  2. Установите первый элемент prefixSum[] таким же, как первый элемент входного массива.
  3. Перебрать входной массив, начиная со второго элемента.
  4. Для каждого элемента вычислите сумму префикса, добавив текущий элемент со значением суммы префикса предыдущего индекса.
  5. Присвойте значение суммы префикса соответствующему индексу в массиве prefixSum.
  6. Повторяйте шаги 3–5, пока не будет достигнут конец входного массива.

Пример времени

Возьмем пример, чтобы понять. Предположим, у нас есть входной массив A = [3, 1, 5, 2, 4]. Мы рассмотрим этапы построения массива сумм префиксов на этом примере.

Шаг 1. Создайте массив, скажем, pf[], который имеет тот же размер, что и входной массив, который в данном случае равен 5.

Шаг 2. Инициализируйте массив суммы префиксов и назначьте ему первый элемент входного массива.

Массив суммы префиксов: [3, _, _, _, _]

Шаг 3. Перебор входного массива, начиная со второго элемента.

Текущий элемент: 1

Шаг 4. Вычислите сумму префикса, добавив текущий элемент со значением суммы префикса предыдущего индекса.

Сумма префикса в индексе 1 = Сумма префикса в индексе 0 + Текущий элемент

Сумма префикса по индексу 1 = 3 + 1 = 4

Шаг 5. Назначьте вычисленное значение суммы префиксов соответствующему индексу в массиве сумм префиксов.

Массив суммы префиксов: [3, 4, _, _, _]

Шаг 6. Повторите шаги 4–5 для остальных элементов входного массива.

Текущий элемент: 5

Сумма префиксов в индексе 2 = Сумма префиксов в индексе 1 + Текущий элемент

Сумма префикса по индексу 2 = 4 + 5 = 9

Массив суммы префиксов: [3, 4, 9, _, _]

Текущий элемент: 2

Сумма префикса в индексе 3 = Сумма префикса в индексе 2 + Текущий элемент

Сумма префикса в индексе 3 = 9 + 2 = 11

Массив суммы префиксов: [3, 4, 9, 11, _]

Текущий элемент: 4

Сумма префикса в индексе 4 = Сумма префикса в индексе 3 + Текущий элемент

Сумма префикса по индексу 4 = 11 + 4 = 15

Массив сумм префиксов: [3, 4, 9, 11, 15]

Шаг 7: построение завершено, и у нас есть массив сумм префиксов для заданного входного массива.

Массив сумм префиксов: [3, 4, 9, 11, 15]

def construct_prefix_sum_array(arr):
  n = len(arr)
  prefix_sum = [0] * n
  prefix_sum[0] = arr[0]
  for i in range(1, n):
  prefix_sum[i] = prefix_sum[i — 1] + arr[i]
  return prefix_sum
public class PrefixSumArray {
  public static int[] constructPrefixSumArray(int[] arr) {
    int n = arr.length;
    int[] prefixSum = new int[n];
    prefixSum[0] = arr[0];
    for (int i = 1; i < n; i++) {
      prefixSum[i] = prefixSum[i — 1] + arr[i];
    }
    return prefixSum;
  }
  public static void main(String[] args) {
    int[] inputArray = {3, 1, 5, 2, 4};
    int[] prefixSumArray = constructPrefixSumArray(inputArray);
    for (int num : prefixSumArray) {
      System.out.print(num + “ “);
    }
  }
}
#include <iostream>
#include <vector>
std::vector<int> constructPrefixSumArray(std::vector<int>& arr) {
  int n = arr.size();
  std::vector<int> prefixSum(n);
  prefixSum[0] = arr[0];
  for (int i = 1; i < n; i++) {
    prefixSum[i] = prefixSum[i — 1] + arr[i];
  }
  return prefixSum;
}
int main() {
std::vector<int> inputArray = {3, 1, 5, 2, 4};
std::vector<int> prefixSumArray = constructPrefixSumArray(inputArray);
for (int num : prefixSumArray) {
  std::cout << num << “ “;
 }
  return 0;
}

Сложность времени и пространства

Временная сложность массива сумм префиксов составляет O(n), где n — размер входного массива. Это связано с тем, что мы проходим по входному массиву один раз, выполняя операцию с постоянным временем для каждого элемента, чтобы вычислить сумму префикса.

Объемная сложность массива сумм префиксов составляет O(n), где n – размер входного массива. Это связано с тем, что мы создаем дополнительный массив того же размера, что и входной массив, для хранения значений суммы префиксов.

Заключение

Массив сумм префиксов служит мощным инструментом для оптимизации вычислений с кумулятивными суммами. Создав массив сумм префиксов, мы можем эффективно отвечать на запросы, связанные с суммами диапазонов, суммами подмассивов и вычислениями средних значений. Возможность выполнять эти вычисления за постоянное время приводит к значительному повышению производительности, особенно для больших наборов данных. Понимание и использование потенциала массивов сумм префиксов дает нам ценную технику для более эффективного решения вычислительных задач.

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