Das finden der Teilmengen von einem array in PHP
Ich habe ein Relationales Schema mit den Parametern (A, B, C, D).
Ich habe eine Menge von Funktionalen Abhängigkeiten das bei mir auch.
Nun muss ich feststellen, das die Schließung für alle möglichen Teilmengen von R auf die Attribute. Das ist, wo ich geblieben bin. Ich muss lernen, Sie zu finden Teilmengen (nicht wiederholte) in PHP.
Mein Array ist wie folgt gespeichert.
$ATTRIBUTES = ('A', 'B', 'C', 'D').
also mein Teilmengen werden sollte
$SUBSET = ('A', 'B', 'C', 'D', 'AB', 'AC', AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'BCD', 'ABCD')
Den code sollte nicht etwas großes, aber für einige Grund, warum ich nicht bekommen kann meinen Kopf um ihn herum.
- Bestellen egal? Auch ich denke, dass Sie möglicherweise verwenden Sie Rekursion.
- Nein, die Reihenfolge nicht egal. ich kann, um es durch die Größe der string später, ich muss nur ein Weg, um die Teilmengen
- Im Grunde sind Sie nur auf der Suche nach der handshake-Algorithmus?
- das ist mehr ein power set Frage. Sie Fragen, um die Leistung zu erzeugen'set von
$attributes
- php.net/manual/en/function.shuffle.php#88408 ist ein power-set-generator Beispiel in php
- genau, die Menge aller Teilmengen oder die powerset. all dieser Zeit ich war auf der Suche mit dem falschen Stichwort. danke. edit: wenn u wollen, u kann machen, dass eine Antwort,ich kann wählen u bis. Frieden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wünschen Sie für die Potenzmenge
$attributes
? Das ist das, was Ihre Frage impliziert.Kann ein Beispiel gefunden hier (zitiert auf Vollständigkeit)
$return = array();
zu$return = array(array());
$b=sprintf(...)
verwenden$i>>$j&1
statt$b{$j} == '1'
- kürzer und schneller.$members
und$count
veraltet:for($i=1<<count($in);--$i;){$out=[];foreach($in as$j=>$u)if($i>>$j&1)$out[]=$u];...}
. Auf diese Weise (mit$i
nicht schlagen0
), es ist auch garantiert, dass$out
ist nie leer, so dass, wenn$minLength
ist1
ist, brauchen Sie nichtcount($out)
entweder.Mit php array_merge können wir eine schöne kurze powerSet Funktion
Hier eine backtracking-Lösung.
gegeben sei eine Funktion zurückgibt, die alle L-Länge Teilmengen der input-set, finden Sie alle L-Länge Teilmengen von L = 2 auf Datensatz-Eingabe Länge
Basierend auf @Yada ' s Antwort, dies erzeugt die Potenzmenge ein array, aber die Erhaltung der ursprünglichen array-keys in jeder Teilmenge (der return-Wert ist immer noch numerisch & sequentiell, indiziert). Dieser sehr nützlich, wenn Sie Teilmengen eines assoziativen Arrays.
Den Teilmengen auch weiterhin das element, um das ursprüngliche array. Ich fügte hinzu, eine stabile Sorte zu
$results
weil ich es brauchte, aber Sie können es weglassen.Bestimmten OP ' s input
var_dump(power_set(['A', 'B', 'C', 'D']));
bietet: