Рубрики

Prefix Sum Array — Внедрение и применение в конкурентном программировании

Для данного массива arr [] размера n его массив префиксных сумм является другим префиксом массиваSum [] такого же размера, что значение prefixSum [i] равно arr [0] + arr [1] + arr [2]… arr [ я].

Примеры :

Input  : arr[] = {10, 20, 10, 5, 15}
Output : prefixSum[] = {10, 30, 40, 45, 60}

Explanation : While traversing the array, update 
the element by adding it with its previous element.
prefixSum[0] = 10, 
prefixSum[1] = prefixSum[0] + arr[1] = 30, 
prefixSum[2] = prefixSum[1] + arr[2] = 40 and so on.

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

Ниже приведена реализация:

C ++

// C ++ программа для реализации
// массив префиксов
#include <bits/stdc++.h>

using namespace std;

  
// Заполняет префиксный массив сумм

void fillPrefixSum(int arr[], int n, int prefixSum[])

{

    prefixSum[0] = arr[0];

  

    // Добавление текущего элемента

    // с предыдущим элементом

    for (int i = 1; i < n; i++)

        prefixSum[i] = prefixSum[i-1] + arr[i];

}

  
// Код драйвера

int main()

{

    int arr[] = { 10, 4, 16, 20 };

    int n = sizeof(arr) / sizeof(arr[0]);

    int prefixSum[n];

  

    fillPrefixSum(arr, n, prefixSum);

    for (int i = 0; i < n; i++)

        cout << prefixSum[i] << " ";

}

Джава

// Java-программа для реализации
// префикс суммы arrayclass

class Prefix

{

    // Заполняет префиксный массив сумм

    static void fillPrefixSum(int arr[], int n,

                               int prefixSum[])

    {

        prefixSum[0] = arr[0];

          

        // Добавление текущего элемента

        // с предыдущим элементом

        for( int i = 1; i < n; ++i )

            prefixSum[i] = prefixSum[i-1] + arr[i];

    }

      

    // Код драйвера

    public static void main(String[] args)

    {

        int arr[] = { 10, 4, 16, 20 };

        int n = arr.length;

        int prefixSum[] = new int[n];

          

        fillPrefixSum(arr, n, prefixSum);

          

        for (int i = 0; i < n; i++)

            System.out.print(prefixSum[i] + " ");

        System.out.println("");

    }

  
}

  
// Этот код предоставлен Сакет Кумар

python3

# Программа Python для реализации
# массив префиксов

  
# Заполняет массив сумм префиксов

def fillPrefixSum(arr, n, prefixSum):

  

    prefixSum[0] = arr[0]

  

    # Добавление существующего элемента

    # с предыдущим элементом

    for i in range(1, n):

        prefixSum[i] = prefixSum[i - 1] + arr[i]

  
# Код драйвера

arr =[10, 4, 16, 20 ]

n = len(arr)

  

prefixSum = [0 for i in range(n + 1)]

  
fillPrefixSum(arr, n, prefixSum)

  

for i in range(n):

    print(prefixSum[i] , " ", end="")

  
# Этот код добавлен
# Анант Агарвал.

C #

// C # Программа для реализации
// префикс суммы arrayclass

using System;

  

class GFG

{

    // Заполняет префиксный массив сумм

    static void fillPrefixSum(int []arr, int n, 

                               int []prefixSum)

    {

        prefixSum[0] = arr[0];

          

        // Добавление текущего элемента

        // с предыдущим элементом

        for( int i = 1; i < n; ++i )

            prefixSum[i] = prefixSum[i - 1] + arr[i];

    }

      

    // Код драйвера

    public static void Main()

    {

        int []arr = { 10, 4, 16, 20 };

        int n = arr.Length;

        int []prefixSum = new int[n];

          

        fillPrefixSum(arr, n, prefixSum);

          

        for (int i = 0; i < n; i++)

            Console.Write(prefixSum[i] + " ");

        Console.Write("");

    }

  
}

  
// Этот код предоставлен nitin mittal

PHP

<?php
// PHP программа для
// Реализация префикса
// массив массива

  
// Заполняет префиксный массив сумм

function fillPrefixSum($arr

                       $n)

{

    $prefixSum = array();

    $prefixSum[0] = $arr[0];

  

    // Добавление текущего элемента

    // с предыдущим элементом

    for ($i = 1; $i < $n; $i++)

        $prefixSum[$i] = $prefixSum[$i - 1] + 

                                    $arr[$i];

          

    for ($i = 0; $i < $n; $i++)

        echo $prefixSum[$i] . " ";

}

  
// Код драйвера

$arr = array(10, 4, 16, 20);

$n = count($arr);

  

fillPrefixSum($arr, $n);

  
// Этот код добавлен
// Sam007
?>


Выход:

10 14 30 50

Приложения :

Пример задачи:

Рассмотрим массив размера n со всеми начальными значениями равными 0. Выполните заданные операции m для сложения из индекса «a» в «b» и оцените самый высокий элемент в массиве. Операция добавления добавляет 100 ко всем элементам от a до b (оба включительно).

Пример :

Input : n = 5 // We consider array {0, 0, 0, 0, 0}
        m = 3.
        a = 2, b = 4.
        a = 1, b = 3.
        a = 1, b = 2.
Output : 300

Explanation : 

After I operation -
A : 0 100 100 100 0

After II operation -
A : 100 200 200 100 0

After III operation -
A : 200 300 200 100 0

Highest element : 300

Простой подход — запустить цикл m раз. Ввод a и b и запуск цикла от a до b, добавление всех элементов на 100.

Эффективный подход с использованием Prefix Sum Array :

1 : Run a loop for 'm' times, inputting 'a' and 'b'.
2 : Add 100 at index 'a' and subtract 100 from index 'b+1'.
3 : After completion of 'm' operations, compute the prefix sum array.
4 : Scan the largest element and we're done.

То, что мы сделали, добавили 100 в 'a', потому что это добавит 100 ко всем элементам, принимая массив префиксных сумм. Вычитание 100 из «b + 1» приведет к отмене изменений, сделанных путем добавления 100 к элементам, начиная с «b».

Для лучшего понимания:


After I operation -
A : 0 100 0 0 -100 
Prefix Sum Array : 0 100 100 100 0

After II operation -
A : 100 100 0 -100 -100
Prefix Sum Array : 100 200 200 100 0

After III operation -
A : 200 100 -100 -100 -100
Prefix Sum Array : 200 300 200 100 0

Final Prefix Sum Array : 200 300 200 100 0 

The required highest element : 300


Последние статьи по технике префиксной суммы

Эта статья предоставлена Rohit Thapliyal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Prefix Sum Array — Внедрение и применение в конкурентном программировании

0.00 (0%) 0 votes