optimize differenceArrayBitmap

This commit is contained in:
Todd Gruben 2017-09-15 17:00:41 -05:00 committed by Travis
parent 71b7216c51
commit 08133368e3
No known key found for this signature in database
GPG key ID: 7F08008DFD9314C9
2 changed files with 9 additions and 18 deletions

View file

@ -2124,6 +2124,7 @@ func intersectArrayBitmap(a, b *container) *container {
output.array = append(output.array, va)
}
}
output.n = len(output.array)
return output
}
@ -2680,26 +2681,17 @@ func differenceRunRun(a, b *container) *container {
func differenceArrayBitmap(a, b *container) *container {
output := &container{container_type: ContainerArray}
itr := newBufBitmapIterator(newBitmapIterator(b.bitmap))
for i := 0; i < len(a.array); {
va := a.array[i]
vb, eof := itr.next()
if eof {
output.add(va)
i++
continue
}
for _, va := range a.array {
bmidx := va / 64
bidx := va % 64
mask := uint64(1) << bidx
b := b.bitmap[bmidx]
if va < vb {
output.add(va)
i++
itr.unread()
} else if va > vb {
// nop
} else {
i++
if mask&^b > 0 {
output.array = append(output.array, va)
}
}
output.n = len(output.array)
return output
}

View file

@ -2498,7 +2498,6 @@ func TestIntersectArrayBitmap(t *testing.T) {
b.container_type = ContainerBitmap
ret1 := intersectArrayBitmapOld(a, b).array
ret2 := intersectArrayBitmap(a, b).array
fmt.Println("ret1", ret1, "ret2", ret2, "test.exp", test.exp)
if len(ret1) == 0 && len(ret2) == 0 && len(test.exp) == 0 {
continue
}