2012-04-07 13 views
0

Ich habe insgesamt Partitionen einer ganzen Zahl und ich will nur diejenigen Partitionen, die alle Werte ungleich haben. Für ex.-Partitionen von 3 sind {1,1,1,1}, {2,2}, {3,1}, {1,1,2} und {4}. Daher sind die erforderlichen ungleichen Partitionen {3,1} und {4}, weil sie keine gleichen Elemente enthalten. Der Code, den ich für das Auffinden aller Partitionen verwendet habe, ist unten aufgeführt. Ich kann die Partitionen filtern, um das gewünschte Ergebnis zu erhalten, aber ich möchte einen effizienten Weg finden, alle Partitionen zu finden, die keine gleichen Bedingungen haben, ohne alle Partitionen zu finden. Ich habe das Netz und Stackoverflow durchsucht, aber nichts sagt genau das Problem aus, dem ich gegenüberstehe. Jede Idee wird geschätzt. Vielen Dank.effiziente Möglichkeit, ungleiche Partitionen einer ganzen Zahl zu finden

function total_partitions_of_a_number($n) {# base case of recursion: zero is the sum of the empty list 
if(!$n) return array(array()); # return empty array 

# modify partitions of n-1 to form partitions of n 
foreach(total_partitions_of_a_number($n-1) as $p) { # recursive call 
$a[] = array_merge(array(1), $p); # "yield" array [1, p...] 
if($p && (count($p) < 2 || $p[1] > $p[0])) { # p not empty, and length < 2 or p[1] > p[0] 
    ++$p[0]; # increment first item of p 
    $a[] = $p; # "yield" p 
} 
} 
return $a; # return all "yielded" values at once 
} 
+0

können Sie ein erwartetes Beispiel ausgeben? – Kerwindena

+0

@Sushant Ihr Beispiel ist zu begrenzt, nicht verstehen, was Sie wollen.Geben Sie mehr Beispiel, dass 6-7 Partition enthalten – safarov

+0

@safarov Ich habe bearbeitet. – Sushant

Antwort

2

Sie wollen nur Partitionen, wo eine bestimmte Komponente nicht mehr als einmal erscheint? Die Rekursion ist einfach.

Reduzieren Sie es auf das Problem der Lösung für die Partitionen von N, so dass kein Element in der Menge größer als ein Wert ist (a wird zunächst N sein.) Nun, ein entweder tut oder nicht in der Partition . Abhängig davon werden Sie beide rekursiv auf die Partitionen von (N-a) auflösen, so dass kein Element größer als a-1 ist, und für die Partitionen von N so, dass kein Element größer als a-1 ist.

In jedem Fall ist die Rekursion gut gestellt und wird beendet, wenn es nicht mehr möglich ist, das Problem zu lösen, also wenn ein * (a + 1)/2 < N. Natürlich, wenn a * (a + 1)/2 = N, können Sie die Rekursion auch schnell beenden, da die Lösung dann eindeutig ist.

+0

Nur zu wissen, wie denkst du über diesen Algorithmus? Und ich verstehe nicht die Logik dahinter. Ich meine, was uns dazu bringt, diesen Weg zu gehen. Wie kann dieser Ansatz jemandem in den Sinn kommen? – Sushant

+0

Was mich dazu gebracht hat, ist der Code, den ich vor ein paar Jahren geschrieben habe. Ich hatte Code, um im Wesentlichen genau zu tun, was Sie wollen (als MATLAB-Code), online im Jahr 2006 veröffentlicht: http://www.mathworks.com/matlabcentral/fileexchange/12009-partitions-of-integer –

+0

Als nicht es zu bekommen, scheint mir klar. Betrachten Sie eine Partition von N. Ist "a" ein Mitglied dieser Partition, wo kein Mitglied dieser Partition größer ist als ein? Wenn dies der Fall ist, kann a nicht mehr als einmal erscheinen. Wenn ein Ereignis vorliegt, müssen Sie nun die Partitionen von N-a und N in beiden Fällen finden, in denen das größte Element nicht größer als a-1 ist. Sicherlich sehen Sie, dass dies ein rekursives Schema ist, das enden muss und am Ende alle Lösungen liefern muss. –

Verwandte Themen