btree: optimize deletion
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Antoine Bartuccio 2019-07-30 17:54:01 +02:00
parent 33657122f9
commit 8dcadb219d
Signed by: klmp200
GPG Key ID: E7245548C53F904B

View File

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