diff --git a/btree/btree.go b/btree/btree.go index 7dd7ab5..048488f 100644 --- a/btree/btree.go +++ b/btree/btree.go @@ -215,17 +215,17 @@ func (n *Node) splitChild(i int, y *Node) { z := newNode(y.t, y.isLeaf) z.numberOfKeys = n.t - 1 - // TODO: make optimisations // Copy the last (t-1) keys of y to z for j := 0; j < n.t-1; j++ { z.keys[j] = y.keys[j+n.t] + if !y.isLeaf { + z.children[j] = y.children[j+n.t] + } } // Copy the last t children of y to z if !y.isLeaf { - for j := 0; j < n.t; j++ { - z.children[j] = y.children[j+n.t] - } + z.children[n.t-1] = y.children[2*n.t-1] } // Reduce the number of keys in y @@ -442,17 +442,17 @@ func (n *Node) borrowFromNext(index int) { // The first key from sibling is inserted into keys[index] n.keys[index] = sibling.keys[0] - // TODO: optimize loops here // Moving all keys in sibling one step behind for i := 1; i < sibling.numberOfKeys; i++ { sibling.keys[i-1] = sibling.keys[i] + if !sibling.isLeaf { + sibling.children[i-1] = sibling.children[i] + } } // Moving the child pointers one step behind if !sibling.isLeaf { - for i := 1; i <= sibling.numberOfKeys; i++ { - sibling.children[i-1] = sibling.children[i] - } + sibling.children[n.numberOfKeys-1] = sibling.children[n.numberOfKeys] } child.numberOfKeys++ @@ -471,25 +471,23 @@ func (n *Node) merge(index int) { // Copies the keys from children[index+1] to children[index] at the end for i := 0; i < sibling.numberOfKeys; i++ { child.keys[i+n.t] = sibling.keys[i] - } - - // Copies the child pointers from C[index+1] to children[index] - if !child.isLeaf { - for i := 0; i <= sibling.numberOfKeys; i++ { + if !child.isLeaf { child.children[i+n.t] = sibling.children[i] } } - // Moves all keys after index in the current node one step before - // to fill the gap created by moving keys[index] to children[index] - for i := index + 1; i < n.numberOfKeys; i++ { - n.keys[i-1] = n.keys[i] + // Copies the child pointers from C[index+1] to children[index] + if !child.isLeaf { + child.children[sibling.numberOfKeys+n.t] = sibling.children[sibling.numberOfKeys] } + // Moves all keys after index in the current node one step before + // to fill the gap created by moving keys[index] to children[index] // Moves the child pointer after (index+1) in the current node one step before // This action marks sibling for deletion by the GC - for i := index + 2; i <= n.numberOfKeys; i++ { - n.children[i-1] = n.children[i] + for i := index + 1; i < n.numberOfKeys; i++ { + n.keys[i-1] = n.keys[i] + n.children[i] = n.children[i+1] } // Updates the key count of child and the current node