• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja zwracająca tablicę tablic wszystkich n-elementowych kombinacji tablicy x

Object Storage Arubacloud
0 głosów
373 wizyt
pytanie zadane 18 marca 2017 w C i C++ przez aPieter Nowicjusz (150 p.)
Przykładowo:

Wszystkie 4-elemntowe kombinacje z tablicy {1,2,3,4,5} = {1,2,3,4}, {1,2,3,5}, {1,2,5,4}, {1,5,3,4}, {5,2,3,4}

Kolejność jest bez znaczenia oraz mogę zagwarantować, że żaden element się nie powtórzy.

Wiem jak policzyć ilość elementów, ale w obliczeniach pojawiają się silnie, więc zakładam, że będzie problem z pamięcią przy tablicach powyżej 15 elementów, ale nie ma to dla mnie zbyt dużego znaczenia.

Jak wyglądałby algorytm(wszystko jedno w jakim języku) który by się z tym uporał?
komentarz 18 marca 2017 przez Michał Muzyka Pasjonat (24,080 p.)
kombinacje z tablicy 5 elementowej do tablic 4 elementowych czy ogółem.

2 odpowiedzi

+2 głosów
odpowiedź 18 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Dla inspiracji....

Z premedytacją rozwiązanie bazujące na strukturze zbioru więc da się to zrobić jeszcze wydajniej :-) Warto zerknąć do <algorithm>. Podpowiadam że tam jest kilka algorytmów które może Ci pomóc :-)

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <set>

using namespace std;

using values_t = vector<int>;
using combinations_t = set<values_t>;

void showCombinations(const combinations_t& combinations) {
    for(const auto& combination: combinations) {
        auto cend = prev(combination.cend());
        copy(combination.cbegin(), cend, ostream_iterator<int>(cout, ", "));
        cout << *(combination.rbegin()) << endl;
    }
}

combinations_t generateCombinations(values_t& values, size_t n) {
    combinations_t combinations;
    do {
        combinations.insert(values_t(values.cbegin(), values.cbegin() + n));
    } while(next_permutation(values.begin(), values.end()));
    return combinations;
}

int main() {

    values_t vec = {1,2,3,4};

    combinations_t combinations = generateCombinations(vec, 3);

    showCombinations(combinations);
}

 

+1 głos
odpowiedź 18 marca 2017 przez Raymond.Z Obywatel (1,800 p.)

Najłatwiejszy sposób jaki mi przyszedł do głowy tak na szybko. 


func combinationWithoutRepetition(array: [Int], subsetNumberOfElements: Int) -> [[Int]] {
    let combination = combinationWithRepetition(array: array, subsetNumberOfElements: subsetNumberOfElements)
    
    let combitationWithoutRepetition = combination.filter { subset in
        let uniqueElementsSubset = Set(subset)
        return uniqueElementsSubset.count == subset.count
    }
    
    return combitationWithoutRepetition
}

func combinationWithRepetition(array: [Int], subsetNumberOfElements: Int) -> [[Int]] {
    var array = array
    
    guard subsetNumberOfElements > 0 else {
        return [[]]
    }
    
    guard array.isEmpty == false else {
        return []
    }
    
    let head = [array[0]]
    let subCombitation = combinationWithRepetition(array: array, subsetNumberOfElements: subsetNumberOfElements - 1)
    var combination = subCombitation.map {head + $0}
    array.remove(at: 0)
    combination += combinationWithRepetition(array: array, subsetNumberOfElements: subsetNumberOfElements)
    return combination
}

Podobne pytania

0 głosów
1 odpowiedź 2,012 wizyt
+2 głosów
2 odpowiedzi 932 wizyt
0 głosów
1 odpowiedź 199 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...