まず、ウィキペディアでの問題の名前は「集合の分割」です。
可能なパーティションをカウントするアルゴリズムがあります。それをスピードアップするために、私はキャッシュを使用します:
function partition($intervalSize, $pieces) {
// special case of integer partitions: ordered integer partitions
// in Wikipedia it is: ordered partition of a set
global $partition_cache;
// CACHE START
$cacheId = $intervalSize.'-'.$pieces;
if (isset($partition_cache[$cacheId])) { return $partition_cache[$cacheId]; }
// CACHE END
if ($pieces == 1) { return 1; }
else {
$sum = 0;
for ($i = 1; $i < $intervalSize; $i++) {
$sum += partition(($intervalSize-$i), ($pieces-1));
}
$partition_cache[$cacheId] = $sum; // insert into cache
return $sum;
}
}
$result = partition(8, 4);
さらに、これらの可能なパーティションのリストを表示する別のアルゴリズムがあります。ただし、まだキャッシュを使用していないため、非常に低速です。
function showPartitions($prefix, $start, $finish, $numLeft) {
global $partitions;
if ($numLeft == 0 && $start == $finish) { // wenn eine Partition fertig ist dann in Array schreiben
$gruppen = split('\|', $prefix);
$partitions[] = $gruppen;
}
else {
if (strlen($prefix) > 0) { // nicht | an Anfang setzen sondern nur zwischen Gruppen
$prefix .= '|';
}
for ($i = $start + 1; $i <= $finish; $i++) {
$prefix .= chr($i+64);
showPartitions($prefix, $i, $finish, $numLeft - 1);
}
}
}
$result = showPartitions('', 0, 8, 4);
だから私は2つの質問があります:1)2番目のアルゴリズムにもキャッシュを実装することは可能ですか?はいの場合、これを行うのを手伝っていただけませんか。2)2番目のアルゴリズムの結果を文字列ではなく構造化配列に書き込むことは可能ですか?
あなたが私を助けてくれることを願っています。事前にどうもありがとうございました!
PS:simonnとDan Dyerの2つの機能に感謝します!