[C++] Befülle eine Liste mit einzigartigen Elementen aus einer Liste von Alternativen
Verfasst: 30.10.2022, 16:39
Ja, ähm, der Titel... besser ein Beispiel, oder?
Gegeben:
Ich muss aus jeder Liste exakt ein Element auswählen, sodass in der resultierenden Liste kein doppelter Eintrag drin ist.
Ein mögliches Ergebnis ohne Kollisionen ist hier z.B:
Weiß jemand, wie man das algorithmisch löst, oder wie man hier nach einem effizienten Algorithmus googelt?
Der Mist ist, dass das lösen einer Kollision zu anderen Kollisionen führen kann.
Man könnte:
1) zwingende Lösungen zu erst populieren hier die [0@2]
2) dann aus auswählbaren Lösungen die einzigartigen populieren, also die, die garantiert keine doppelungen haben oder erzeugen. Hier die [9@3]
3) und dann den Rest durchzählen im sinne von "eine Nummer erzeugen, in der jede stelle für den Index in der Original-Liste steht"
übrig bleibt die Liste[0] mit [4,5] und Liste[1] mit [4,5] und da braucht Index "01" um die 4@0 der einen und die 5@1 der anderen Liste zu erwählen.
3.1) Das durchzählen ist aber sicher langsam, daher verändert man der Reihe nach nur die Indices mit Doppelungen. Dafür muss man aber jedes mal Doppelungen feststellen - muss man aber so oder so, weil man muss ja die Validität der Lösung prüfen..
Ich weiß aber nicht, ob sowas in einer garantierten Lösung endet, oder wie effizient das ist.
Fun-Fact: es geht nicht um Integers, sondern um Typen und das ganze wird constexpr-template-magic im Kontext eines variadischen Templates. Die Listen sind tuple usw. Das ganze ist also in einem Header und sollte das compilieren nicht all zu sehr aufhalten. Spaß! Es wird niemals mehr als 16 listen geben und die Listen sind zwischen 1..4 Elementen lang.
Gibts für solche Probleme irgendwelche schlauen Baumstrukturen oder sowas?
Gegeben:
Code: Alles auswählen
Liste[0] = [0, 4, 5]
Liste[1] = [4, 5]
Liste[2] = [0]
Liste[3]= [5, 9]
Ein mögliches Ergebnis ohne Kollisionen ist hier z.B:
Code: Alles auswählen
[4@0, 5@1, 0@2, 9@3] oder [5@0, 4@1, 0@2, 9@3]
Der Mist ist, dass das lösen einer Kollision zu anderen Kollisionen führen kann.
Man könnte:
1) zwingende Lösungen zu erst populieren hier die [0@2]
2) dann aus auswählbaren Lösungen die einzigartigen populieren, also die, die garantiert keine doppelungen haben oder erzeugen. Hier die [9@3]
3) und dann den Rest durchzählen im sinne von "eine Nummer erzeugen, in der jede stelle für den Index in der Original-Liste steht"
übrig bleibt die Liste[0] mit [4,5] und Liste[1] mit [4,5] und da braucht Index "01" um die 4@0 der einen und die 5@1 der anderen Liste zu erwählen.
3.1) Das durchzählen ist aber sicher langsam, daher verändert man der Reihe nach nur die Indices mit Doppelungen. Dafür muss man aber jedes mal Doppelungen feststellen - muss man aber so oder so, weil man muss ja die Validität der Lösung prüfen..
Ich weiß aber nicht, ob sowas in einer garantierten Lösung endet, oder wie effizient das ist.
Fun-Fact: es geht nicht um Integers, sondern um Typen und das ganze wird constexpr-template-magic im Kontext eines variadischen Templates. Die Listen sind tuple usw. Das ganze ist also in einem Header und sollte das compilieren nicht all zu sehr aufhalten. Spaß! Es wird niemals mehr als 16 listen geben und die Listen sind zwischen 1..4 Elementen lang.
Gibts für solche Probleme irgendwelche schlauen Baumstrukturen oder sowas?