La idea es sacar todas las posibles combinaciones para un set de datos, en este caso las letras de la a-h. Queremos todos los pares, tríos, cuartetos, etcétera, en los que pueden aparecer estos elementos. Planeamos este algoritmo originalmente para poder sacar relaciones comunes entre documentos con varias etiquetas.
Last active
October 11, 2015 14:38
-
-
Save jaimerodas/3874475 to your computer and use it in GitHub Desktop.
Combinatoria
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
// Algoritmo para sacar las combinaciones de n elementos | |
// Los elementos que hay que combinar | |
$elementos = array('a','b','c','d','e','f','g','h'); | |
$elementos_invert = array_flip($elementos); | |
$cuantos = count($elementos); | |
$corridas = array(); | |
$resultados = $elementos; | |
// Por cada elemento, hay una vuelta, un nCr | |
for ($i=1; $i<=$cuantos; $i++) { | |
// La primera corrida son los elementos a secas | |
if (!isset($corridas[$i-1])) { | |
$corridas[$i] = $elementos; | |
continue; | |
} | |
$elementos_new = $elementos; | |
// Las letras sobrantes | |
$letras_slice = array_slice($elementos_new, ($i-1)); | |
$letras_rebuilt = implode("", $letras_slice); | |
// Cada elemento de la vuelta anterior es una vuelta en esta | |
foreach($corridas[$i-1] as $j=>$itera) { | |
$subletras = str_split($itera); | |
$subletras_c = count($subletras)-1; | |
// Cada letra de las letras sobrantes es otra vuelta | |
foreach ($letras_slice as $itera2) { | |
$letra_fin = $elementos_invert[$subletras[$subletras_c]]; | |
$letra_coteja = $elementos_invert[$itera2]; | |
if (!in_array($itera2, $subletras) && ($letra_fin < $letra_coteja) | |
) { | |
$corridas[$i][] = $itera.$itera2; | |
$resultados[] = $itera.$itera2; | |
} | |
} | |
} | |
} | |
print_r($resultados); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment