में अद्वितीय क्रमपरिवर्तन की कुशलतापूर्वक गणना करना मैं वर्तमान में डेटा की एक सरणी के अद्वितीय क्रमपरिवर्तन की गणना कर रहा हूं। जबकि निम्न कोड काम कर रहा है, यह उतना कुशल नहीं है जितना मैं चाहूंगा। एक बार जब मैं 6 या 8 से अधिक वस्तुओं को प्राप्त करता हूं, तो यह बहुत धीमा हो जाता है और मैं स्मृति समस्याओं में दौड़ना शुरू करता हूं।एक सेट
यहाँ कोड और एक विवरण
<?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;
}
इनपुट [1, 1, 2]
मैं निम्नलिखित उत्पादन की उम्मीद के रूप में प्राप्त देखते हुए
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
$count
पैरामीटर है तो मैं अद्वितीय क्रमपरिवर्तन की संख्या पारित कर सकते हैं मैं फ़ंक्शन की अपेक्षा करें और एक बार इसे कई बार मिल जाए, तो यह डेटा की गणना करना बंद कर सकता है। यह सभी डुप्लिकेट की गिनती के फैक्टोरियल के उत्पाद द्वारा विभाजित वस्तुओं की कुल संख्या के फैक्टोरियल के रूप में गणना की जाती है। मुझे यकीन नहीं है कि मैंने कहा है कि ठीक है तो मुझे आपको एक उदाहरण दिखाएं।
सेट [1, 2, 2, 3, 4, 4, 4, 4]
क्योंकि वहाँ 8 कुल आइटम, उनमें से एक दो बार दोहराया गया है कर रहे हैं अद्वितीय क्रमपरिवर्तन की गिनती 8!/(2!4!) = 840
के रूप में गणना की जाती है, और एक अन्य 4 बार दोहराया गया है को देखते हुए।
अब अगर मैं php कोड है कि अनुवाद करते हैं ...
<?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);
यह बहुत धीमी है। अगर मैं permuteUnique
फ़ंक्शन में काउंटर फेंकता हूं, तो यह 840 अद्वितीय क्रमिकताओं को खोजने से पहले 100k बार से अधिक चलाता है।
मैं इसे कम करने और अद्वितीय क्रमपरिवर्तनों के लिए सबसे कम संभव पथ खोजने का तरीका ढूंढना चाहता हूं। मैं आपकी सहायता या सलाह की सराहना करता हूं।
सी ++ के लिए ['std :: next_permutation'] (http://en.cppreference.com/w/cpp/algorithm/next_permutation) देखें और PHP के लिए ऐसा कुछ ढूंढें या कार्यान्वित करें। – MvG