![]() |
alle Tupel einer Variation ermitteln
Hallo Leute,
irgentwo hängt es bei mir, aber mir fällt echt kein Weg ein. Ich will alle Variationen einer Menke n zur k-ten Klasse ermitteln. Die anzahl dieser Variationen zu berechnen ist sicher nicht schwer. Dies erfolgt nach der Formel: ![]() Nun möchte ich aber alle möglichen Einzelmengen ermitteln und speichern (Ort ist erst mal egal, kann Array, Object, List oder sonst was sein). die Variation ist laut Wikipedia wie folgt definiert: ![]() Wie kann ich jetzt alle betreffenden Teilmengen (Tupel) ermitteln? Dank im Voraus oki |
Re: alle Tupel einer Variation ermitteln
Such mal hie rim Forum nach
![]() |
Re: alle Tupel einer Variation ermitteln
![]()
Delphi-Quellcode:
erzeugt dann eine Liste wie
CombiStrings(['A', 'B', 'C', 'D'], True);
Code:
Gruß Hagen
A,B,C,D
A,B,D,C A,C,B,D A,C,D,B A,D,B,C A,D,C,B B,A,C,D B,A,D,C B,C,A,D B,C,D,A B,D,A,C B,D,C,A C,A,B,D C,A,D,B C,B,A,D C,B,D,A C,D,A,B C,D,B,A D,A,B,C D,A,C,B D,B,A,C D,B,C,A D,C,A,B D,C,B,A |
Re: alle Tupel einer Variation ermitteln
Dank Lucki, Dank negaH!!
Das bringt mich nach vorne und den Rest bekomme ich dann hin. Gruß oki |
Re: alle Tupel einer Variation ermitteln
Hi
Zitat:
Ich benötige die Tupel einer Variation, nicht Kombination. :warn: das sind zwar bedeutend weniger, aber stimmen muß es trotzdem. Hat da jemand noch eine Formel oder einen Algorithmus? Der Verweis nach bruteforce war zwar schon die richtige Richtung, trifft aber nicht ganz (knapp daneben ist auch vorbei). Gruß oki |
Re: alle Tupel einer Variation ermitteln
![]() lies dir das mal durch, dein obiger Link hat nichts mit Kombinatorik zu tuen. Und eine Permutation ist auch eine Variation, allerdings eben von N Elementen auf K Plätzen, wobei N==K. Bei einer Variation ist also N >= K. Mein Code sollte ohne weiteres abänderbar sein. Gruß Hagen |
Re: alle Tupel einer Variation ermitteln
Hier eine Möglichkeit:
Delphi-Quellcode:
Die Routine erstellt aus dem String s (Länge = n) alle k Teilmengen. Sei s='12345' und k=3, dann erfolgt der Aufruf mit:
Procedure Variation (Const s,q : String; i,k,n : Integer);
Var j : Integer; Begin if k=0 Then Form1.memo1.Lines.Add(q) // Teilmenge gefunden, irgendwo muss sie ja hin else For j:=i+1 to n - k + 1 do Variation (s,q+s[j],j,k-1,n) End;
Delphi-Quellcode:
[edit]Aufruf korrigiert. i ist Anfangs 0 (und nicht 1)[/edit]
Variation ('12345','',0,3,5)
|
Re: alle Tupel einer Variation ermitteln
Hi,
@negaH: Hast recht! Ich war auf deinem Link bei Wikipedia und hatte nochmals Variation als Suchbegriff eingegeben. Beim thread schreiben und Umschalten hattte ich dann aus Versehen den falschen Link gesetzt. Sich ist jede Permutation auch eine Variation, aber nicht jede Variation ist auch eine Permutation. Und ich brauche halt die Variation und nicht eine spezielle Form der Variation, hier Permutation. Trotzdem hilft mir das. Mir ist leider nur noch nicht aufgegangen, wo ich deinen Code ändern muß um eine Variation zu bekommen (Im funktionsaufruf die Klasse mit angeben ist natürlich obligatorisch). @alzaimar: Ich hatte im stillen gehofft, dass du dich meldest. Bei meiner suche hier im forum ist mir schon aufgefallen, dass du hier wohl der Matheguru bist. Hat auch geklappt :zwinker: . Dank für die Hilfe. Ich bin erstaunt, wie kurz man das halten kann. Auf anhieb versteh ich den Code zwar nicht, aber ich teste ihn und stell dann später meine Fragen. Dank und Gruß oki |
Re: alle Tupel einer Variation ermitteln
Zitat:
Zitat:
Gehen wir das ganze rekursiv an. Dann muss man die Aufgabenstellung so umformulieren, das ich eine Grundsituation habe, die ich mit einem Schritt weiter zur Lösung bringt. Daneben benötige ich eine Ausgangssituation sowie ein Abbruchkriterium. Na gut, ich hab schon q Elemente extrahiert. Diese Elemente habe ich irgendwie aus den Stellen 1..i des Grundstrings genommen. Logisch, das ich nur noch die Elemente i+1 .. n für den Rest verwenden kann. Na gut, dann beppe ich einfach sukkessiv jeweils ein Element (nämlich die elemente i+1 .. n) an q ran und mache dann rekursiv weiter. Gut, wie fangen wir an? Klar, q ist zunächst leer und ich habe also noch alle Elemente zur Verfügung, um die Teilmengen aufzubauen. Wann hören wir auf? Auch klar, wenn in q genau k Elemente enthalten sind. Natürlich hab ich einen kleinen Fehler im Aufruf eingebaut, der aber mittlerweile behoben ist. |
Re: alle Tupel einer Variation ermitteln
nimm alzaimar code, dieser ist von der Lesbarkeit viel eleganter als meiner. Allerdings muß ich als Verteidung anführen das es bei meinem Codebeispiel auch darum ging ohne aufwendige Stringfunktionen -> s := s + t usw. auszukommen ;) Solche Operationen sind immer sehr langsam.
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz