Exemplo n.º 1
0
        internal void Scan()
        {
            if (Root.NbKeys == 0)
            {
                return;
            }
            ScanDataClass scanData = new ScanDataClass();

            ScanBTree(Root, 0, scanData);
            Helper.Trace($"lgChemin={scanData.lgChemin}, nbkeysmax={scanData.nbKeysMax}, nbkeysactual={scanData.nbKeysActual}, remplissage={100.0 * scanData.nbKeysActual / scanData.nbKeysMax} %");
            Helper.Assert(scanData.nbKeysActual == NbKeys);
        }
Exemplo n.º 2
0
        private void ScanBTree(BTreeNode node, int profondeur, ScanDataClass scanData)
        {
            scanData.nbKeysMax    += Order - 1;
            scanData.nbKeysActual += node.NbKeys;
            bool bchildren = !node.Leaf;

            Helper.Assert(node == Root || IsAtLeastHalfFull(node));
            if (bchildren)
            {
                // On descend en bas à gauche
                Helper.Assert(node.NbKeys == node.NbChildren - 1);
                ScanBTree(node.Child(0), profondeur + 1, scanData);
            }
            else if (scanData.bLgCheminSet)
            {
                Helper.Assert(profondeur == scanData.lgChemin);
            }
            else
            {
                scanData.lgChemin     = profondeur;
                scanData.bLgCheminSet = true;
            }
            for (int i = 0; i < node.NbKeys; i++)
            {
                int value = node.Key(i);
                if (!scanData.previousValueSet)
                {
                    Helper.Assert(i == 0 && !bchildren);
                    scanData.previousValue    = node.Key(0);
                    scanData.previousValueSet = true;
                }
                else
                {
                    // previousValue est censée être la plus grande key dans le sous-arbre à gauche
                    Helper.Assert(scanData.previousValue < value);
                    scanData.previousValue = value;
                }
                if (bchildren)
                {
                    ScanBTree(node.Child(i + 1), profondeur + 1, scanData);
                }
            }
        }