1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
<?php
function partition($index, $p, $n, $ordered, $liste) {
if ($index>=$p) {// la liste est construite -> FIN
$comb = implode("-", $liste);
$existe = "SELECT COMB_P FROM COMB_P_N WHERE COMB_P = '".$comb."'";
$existe = mysql_query($existe);
if (mysql_num_rows($existe) == 0) {
$query = "INSERT INTO COMB_P_N (COMB_P, PARMI_N, P) VALUES ('".$comb."', ".$n.", ".$p.")";
$result = mysql_query($query);
}
return;
}
// ajoute un nouvel element candidat dans la liste
// - sans ordre -> candidat: tous les elements
// - avec ordre -> candidat: seulement les elements supérieurs au précédant
$start=1;
if ($ordered && $index>0) {
$start = $liste[$index-1]+1;
}
for($i=$start;$i<=$n;$i++) {
$liste[$index] = $i;
partition($index+1, $p, $n, $ordered, $liste);
}
}
function partition2($index, $p, $n, $liste, $liste2, $id_comb) {
if ($index>=$p) {// la liste est construite -> FIN
$comb = implode("-", $liste);
$existe = "SELECT ID_COMB_4_P, COMB_4 FROM COMB_4_P WHERE COMB_4 = '".$comb."'";
$existe = mysql_query($existe);
if (mysql_num_rows($existe) == 0) {
//$query = "INSERT INTO COMB_".$n."_".$p." (ID_COMB_".$n.", COMB_".$n."_".$p.") VALUES (".$id_comb.", '".implode("-", $liste)."');";
$query = "INSERT INTO COMB_4_P (COMB_4, PARMI_P) VALUES ('".$comb."', ".$n.");";
$result = mysql_query($query);
$last_id = "SELECT LAST_INSERT_ID() ID;";
$last_id = mysql_query($last_id);
$last_id = mysql_fetch_array($last_id);
$result = mysql_query("INSERT INTO CONTIENT (ID_COMB_P_N, ID_COMB_4_P) VALUES (".$id_comb.", ".$last_id['ID'].")");
} else {
$existe = mysql_fetch_array($existe);
$result = mysql_query("INSERT INTO CONTIENT (ID_COMB_P_N, ID_COMB_4_P) VALUES (".$id_comb.", ".$existe['ID_COMB_4_P'].")");
}
return;
}
// ajoute un nouvel element candidat dans la liste
// - sans ordre -> candidat: tous les elements
// - avec ordre -> candidat: seulement les elements supérieurs au précédant
$start=0;
if ($index>0) {
$start = array_search($liste[$index-1], $liste2) + 1;
}
for($i=$start;$i<$n;$i++) {
$liste[$index] = $liste2[$i];
partition2($index+1, $p, $n, $liste, $liste2, $id_comb);
}
}
set_time_limit (0);
include "connexion_bdd.php";
/************************************/
/* TABLE COMB_P_N */
/************************************/
/* 30 minutes environ pour le remplissage */
for ($j=5;$j<8;$j++) {
for ($i=10;$i<23;$i++) {
partition(0, $j, $i, true, array());
}
}
/************************************/
/* TABLES COMB_4_P et CONTIENT */
/************************************/
/* 20 minutes environ pour le remplissage */
$result = mysql_query("SELECT ID_COMB_P_N ID_COMB, COMB_P COMB FROM COMB_P_N");
while ($row = mysql_fetch_array($result)) {
$array = explode('-', $row['COMB']);
partition2(0, 4, count($array), array(), $array, $row['ID_COMB']);
}
mysql_close($conn);
?> |
Partager