먼저 : 위키 백과의 문제 이름은 "집합의 정렬 된 파티션"입니다.PHP : 캐싱 순서화 정수 알고리즘
나는 가능한 파티션을 계산하는 알고리즘을 가지고 있습니다. 속도를 높이기 위해 캐시를 사용합니다.
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);
그래서 나는 두 가지 질문이 있습니다 1) 두 번째 알고리즘 캐시를 구현할 수를 너무? 그렇다면이 일을 도와 주시겠습니까? 2) 두 번째 알고리즘의 결과를 문자열 대신 구조화 된 배열에 쓸 수 있습니까?
도와 주시면 감사하겠습니다. 대단히 감사드립니다!
추신 : 두 가지 기능, Simonn과 Dan Dyer에게 감사드립니다.
고맙습니다. – caw