Найти все комбинации, которые складываются до заданного числа, используя параллельные потоки - PullRequest
0 голосов
/ 20 мая 2019

Проблема состоит в том, чтобы найти способ достичь того же результата, который уже достигнут в приведенном ниже коде, но использовать произвольное количество потоков, использовать критическую секцию и семафор, чтобы распараллелить приведенный ниже код

Я пытался распараллелить рекурсивные части кода, но не нашел разумного решения

Здесь можно как-то распараллелить код, для распараллеливания кода можно использовать семафор, но не ясно, какие именно части можно запускать параллельно


Уже работающее решение:

C ++ программа для поиска всех комбинаций положительные числа, которые складываются до данного числа

#include <iostream> 
using namespace std; 

//    arr - array to store the combination 
//    index - next location in array 
//    num - given number 
//    reducedNum - reduced number 

void findCombinationsUtil(int arr[], int index, 
                       int num, int reducedNum) 
{ 
    // Base condition 
    if (reducedNum < 0) 
        return; 

    // If combination is found, print it 
    if (reducedNum == 0) 
    { 
        for (int i = 0; i < index; i++) 
            cout << arr[i] << " "; 
        cout << endl; 
        return; 
    } 

    // Find the previous number stored in arr[] 
    // It helps in maintaining increasing order 
    int prev = (index == 0)? 1 : arr[index-1]; 

    // note loop starts from previous number 
    // i.e. at array location index - 1 
    for (int k = prev; k <= num ; k++) 
    { 
        // next element of array is k 
        arr[index] = k; 

        // call recursively with reduced number 
        findCombinationsUtil(arr, index + 1, num, 
                                 reducedNum - k); 
    } 
} 

Функция, чтобы узнать все комбинации положительные числа, которые складываются до заданного числа. Он использует findCombinationUtil ()

void findCombinations(int n) 
{ 
    // array to store the combinations 
    // It can contain max n elements 
    int arr[n]; 

    //find all combinations 
    findCombinationsUtil(arr, 0, n, n); 
} 

Код драйвера

int main() 
{ 
    int n = 5; 
    findCombinations(n); 
    return 0; 
} 

источник: https://www.geeksforgeeks.org/find-all-combinations-that-adds-upto-given-number-2/

1 Ответ

1 голос
/ 20 мая 2019

Я процитирую предложение из другого ответа:

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

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

См. Эти ссылки для получения дополнительной информации.

https://www.codeproject.com/Articles/1247260/Cplusplus-Simple-Permutation-and-Combination-Paral

Распараллеливание рекурсивной функции с использованием OpenMP в C ++

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