Ich bin derzeit die einzigartigen Permutationen eines Arrays von Daten zu berechnen. Während der folgende Code funktioniert, ist es nicht so effizient, wie ich es möchte. Sobald ich über 6 oder 8 Elemente bekomme, wird es sehr langsam und ich bekomme Probleme mit dem Speicher. HierBerechnung Effizientes einzigartige Permutationen in einem Satz
ist der Code und eine Erklärung
<?php
function permuteUnique($items, $count = false, $perms = [], &$return = []) {
if ($count && count($return) == $count) return $return;
if (empty($items)) {
$duplicate = false;
foreach ($return as $a) {
if ($a === $perms) {
$duplicate = true;
break;
}
}
if (!$duplicate) $return[] = $perms;
} else {
for ($i = count($items) - 1; $i >= 0; --$i) {
$newitems = $items;
$newperms = $perms;
list($tmp) = array_splice($newitems, $i, 1);
array_unshift($newperms, $tmp);
permuteUnique($newitems, $count, $newperms, $return);
}
return $return;
}
}
function factorial($n) {
$f = 1;
for ($i = 2; $i <= $n; $i++) $f *= $i;
return $f;
}
den Eingang gegeben [1, 1, 2]
ich die folgende Ausgabe erhalten wie erwartet
array (size=3)
0 =>
array (size=3)
0 => int 1
1 => int 1
2 => int 2
1 =>
array (size=3)
0 => int 1
1 => int 2
2 => int 1
2 =>
array (size=3)
0 => int 2
1 => int 1
2 => int 1
Der $count
Parameter ist, so kann ich die Anzahl der eindeutigen Permutationen passieren I erwarte mit der Funktion und sobald es so viele gefunden hat, kann es aufhören zu berechnen und die Daten zurückgeben. Dies wird berechnet als die Fakultät der Gesamtzahl von Gegenständen, dividiert durch das Produkt der Fakultät der Zählung aller Duplikate. Ich bin mir nicht sicher, ob ich das richtig gesagt habe, also lass mich dir ein Beispiel zeigen.
der Satz [1, 2, 2, 3, 4, 4, 4, 4]
die Anzahl der eindeutigen Permutationen gegeben als 8!/(2!4!) = 840
berechnet wird, weil es insgesamt 8 Elemente sind, einer von ihnen zweimal dupliziert, und eine weitere 4-mal dupliziert.
Nun, wenn ich die PHP-Code übersetzen ...
<?php
$set = [1, 2, 2, 3, 4, 4, 4, 4];
$divisor = 1;
foreach (array_count_values($set) as $v) {
$divisor *= factorial($v);
}
$count = factorial(count($set))/$divisor;
$permutations = permuteUnique($set, $count);
es ist ziemlich langsam. Wenn ich einen Zähler in die permuteUnique
Funktion werfe, läuft es über 100k Mal, bevor es die 840 einzigartigen Permutationen findet.
Ich möchte einen Weg finden, diese zu reduzieren und den kürzesten Weg zu den einzigartigen Permutationen zu finden. Ich schätze jede Hilfe oder Ratschläge, die Sie geben können.
Schauen Sie sich ['std :: next_permutation'] (http://en.cppreference.com/w/cpp/algorithm/next_permutation) für C++ an und suchen oder implementieren Sie so etwas für PHP. – MvG