• 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

HackNation - ogólnopolski hackathon
0 głosów
726 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 (158,940 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,465 wizyt
+2 głosów
2 odpowiedzi 1,738 wizyt
0 głosów
1 odpowiedź 653 wizyt

93,626 zapytań

142,550 odpowiedzi

323,036 komentarzy

63,129 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1452p. - dia-Chann
  2. 1437p. - DziarnowskiJ
  3. 1411p. - Łukasz Piwowar
  4. 1409p. - CC PL
  5. 1371p. - raydeal
  6. 1369p. - Adrian Wieprzkowicz
  7. 1360p. - Tomasz Bielak
  8. 1335p. - robwarsz
  9. 1275p. - Maurycy W
  10. 1141p. - ssynowiec
  11. 1116p. - rucin93
  12. 1100p. - Mariusz Fornal
  13. 885p. - Dominik Łempicki (kapitan)
  14. 847p. - Grzegorz Aleksander Klementowski
  15. 838p. - Wojciech Malicki
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...