private void btAjouter_Click(object sender, EventArgs e) { try { Ordre = int.Parse(tbOrder.Text); if (Ordre < 2) { throw new ApplicationException("L'ordre est incorrect"); } int nb = int.Parse(tbNb.Text); if (nb < 1) { throw new ApplicationException("Le nombre est incorrect"); } int max = int.Parse(tbMax.Text); if (max < nb) { throw new ApplicationException("Le max est incorrect"); } if (BTree == null || BTree.Order != Ordre) { BTree = new BTreeClass(Ordre); } List <int> v = new List <int>(max); for (int i = 0; i < max; i++) { v.Add(i); } int seed = int.Parse(tbSeed.Text); Random rnd = new Random(seed); for (int i = 0; i < nb; i++) { int j = rnd.Next(v.Count); int n = v[j]; v.RemoveAt(j); bool bOK = BTree.Add(n); Helper.Assert(bOK); } ShowTreeView(); ScanBTree(BTree); } catch (ApplicationException ex) { Trace(ex.Message); BTree = null; } catch (Exception ex) { Trace(ex.ToString()); BTree = null; } }
private void btMassAdd_Click(object sender, EventArgs e) { try { Ordre = int.Parse(tbOrder.Text); if (Ordre < 2) { throw new ApplicationException("L'ordre est incorrect"); } BTreeClass BTree = new BTreeClass(Ordre); // valeurs entre 0 et max-1 int max = 1_000_000_000; // Nombre de tentatives d'insertions // Le nombre final d'insertions est inférieur // si random.Next() renvoie plusieurs fois une même valeur int nb = 60_000_000; int seed = 0; Random random = new Random(seed); // Random random = new Random(); Stopwatch stopwatch = Stopwatch.StartNew(); for (int i = 0; i < nb; i++) { BTree.Add(random.Next(max)); } stopwatch.Stop(); Helper.Trace($"Order={Ordre}"); Helper.Trace($"test insertion de {nb} valeurs en {stopwatch.Elapsed}"); stopwatch.Restart(); ScanBTree(BTree); Helper.Trace($"vérification en {stopwatch.Elapsed}"); } catch (ApplicationException ex) { Trace(ex.Message); } catch (Exception ex) { Trace(ex.ToString()); } }
// Vagues successives d'ajouts et suppressions dans un BTree private void btAddSuppr_Click(object sender, EventArgs e) { try { Ordre = int.Parse(tbOrder.Text); if (Ordre < 2) { throw new ApplicationException("L'ordre est incorrect"); } int nb = int.Parse(tbNb.Text); if (nb < 1) { throw new ApplicationException("Le nombre est incorrect"); } int max = int.Parse(tbMax.Text); if (max < nb) { throw new ApplicationException("Le max est incorrect"); } Trace("début test"); // On part d'un arbre vide BTree = new BTreeClass(Ordre); List <int> valeursDispo = new List <int>(max); List <int> valeursIncluses = new List <int>(nb); for (int i = 0; i < max; i++) { valeursDispo.Add(i); } int seed = int.Parse(tbSeed.Text); Random rnd = new Random(seed); for (int i = 0; i < nb; i++) { int j = rnd.Next(valeursDispo.Count); int n = valeursDispo[j]; valeursDispo.RemoveAt(j); valeursIncluses.Add(n); bool bOK = BTree.Add(n); Helper.Assert(bOK); } // on va faire une boucle externe i dans laquelle on supprime Si clés et on en ajoute Ai, Si > Ai, de manière à vider le BTree while (BTree.NbKeys > 0) { int S = BTree.NbKeys / 2; if (S == 0) { // puisque BTree n'est pas vide, on supprime toujours au moins une clé S = 1; } for (int i = 0; i < S; i++) { int j = rnd.Next(valeursIncluses.Count); int n = valeursIncluses[j]; valeursIncluses.RemoveAt(j); valeursDispo.Add(n); bool bOK = BTree.Remove(n); Helper.Assert(bOK); //ScanBTree(BTree); } // Et on rajoute qq clés int N = S / 2; for (int i = 0; i < N; i++) { int j = rnd.Next(valeursDispo.Count); int n = valeursDispo[j]; valeursDispo.RemoveAt(j); valeursIncluses.Add(n); bool bOK = BTree.Add(n); Helper.Assert(bOK); } } } catch (ApplicationException ex) { Trace(ex.Message); BTree = null; } catch (Exception ex) { Trace(ex.ToString()); BTree = null; } Trace("test terminé"); }