Diviser pour mieux régner
Bonjour,
J'ai un petit problème : je dois exécuter une requête SQL et je voudrais diviser les resultats obtenus sans perte de données. En gros, la requête doit faire un "BETWEEN a AND b". J'ai donc deux entiers A et B ainsi qu'un nombre de parties désiré C (approximatif, le plus important c'est d'avoir toutes les données sans doublons).
Par exemple, j'ai réussi à avoir un algo qui me donne si A = 0, B = 10 et C = 5 (même chose si C = 4...) les valeurs suivantes [0,2], [3,5], [6,8], [9,10].
Comme ça après au lieu de faire ma requête SQL "BETWEEN 0 AND 10" je peux faire 4 requêtes "BETWEEN 0 AND 2", "BETWEEN 3 AND 5" etc.
L'algorithme fonctionne bien (en tout cas pour les valeurs testées...) mais il est assez expérimental et je me demandais si y a pas quelque chose de plus correct.
Voici l'algo (en Java)
Code:
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
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int aMin;
int aMax;
int nbParts;
Scanner sc = new Scanner(System.in);
System.out.print("Min = ");
aMin = sc.nextInt();
System.out.print("Max = ");
aMax = sc.nextInt();
System.out.print("NbParts = ");
nbParts = sc.nextInt();
int onePart = ((aMax - aMin) / nbParts);
System.out.println(onePart);
if(aMin == aMax)
{
// 1 process
System.out.println("Only one process with nb = " + ((aMin + aMax)/2));
}
else if(aMin < aMax)
{
// If nbParts > (aMax-Min) => onePart = 0
if(onePart == 0)
{
System.out.println("Infinite loop.");
System.exit(-1);
}
System.out.println("Several processes begin.");
for(int i = aMin; i < aMax; i += (onePart + 1))
{
int from = i;
int until = (i + onePart);
if(i > (aMax - onePart)) {
System.out.println("------------- LAST -------------");
System.out.println("FROM = " + from);
System.out.println("UNTIL = " + aMax);
break;
}
System.out.println("----------- ONE PROCESS -----------");
System.out.println("FROM = " + from);
System.out.println("UNTIL = " + until);
}
}
else
System.out.println("ERROR !");
}
} |