Skip to content

Commit 89d0e1f

Browse files
committed
impl. NewTreeConcurrent
1 parent 4fc58fb commit 89d0e1f

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ To apply this library to types of one-dimensional intervals, you must provide a
8181
type Tree[T any] struct{ ... }
8282
func NewTree[T any](cmp func(a, b T) (ll, rr, lr, rl int), items ...T) Tree[T]
8383

84+
func NewTreeConcurrent[T any](jobs int, cmp func(a, b T) (ll, rr, lr, rl int), items ...T) Tree[T]
85+
8486
func (t Tree[T]) Insert(items ...T) Tree[T]
8587
func (t Tree[T]) Delete(item T) (Tree[T], bool)
8688

treap_test.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"math"
55
"math/rand"
66
"reflect"
7+
"runtime"
78
"strconv"
89
"strings"
910
"testing"
@@ -65,6 +66,22 @@ func equalStatistics(t1, t2 interval.Tree[uintInterval]) bool {
6566
return a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2
6667
}
6768

69+
func equalsSizeAndOrder[T any](t1, t2 interval.Tree[T]) bool {
70+
var t1InOrder []T
71+
t1.Visit(t1.Min(), t1.Max(), func(item T) bool {
72+
t1InOrder = append(t1InOrder, item)
73+
return true
74+
})
75+
76+
var t2InOrder []T
77+
t2.Visit(t2.Min(), t2.Max(), func(item T) bool {
78+
t2InOrder = append(t2InOrder, item)
79+
return true
80+
})
81+
82+
return reflect.DeepEqual(t1InOrder, t2InOrder)
83+
}
84+
6885
func TestNewTree(t *testing.T) {
6986
t.Parallel()
7087

@@ -169,33 +186,29 @@ func TestNewTreeConcurrent(t *testing.T) {
169186
tree1 := interval.NewTree(cmpUintInterval, ivals[0])
170187
tree2 := interval.NewTreeConcurrent(1, cmpUintInterval, ivals[0])
171188

172-
if !equalStatistics(tree1, tree2) {
173-
t.Fatal("New() differs with NewConcurrent(), statistics differ")
189+
if !equalsSizeAndOrder(tree1, tree2) {
190+
t.Fatal("New() differs with NewConcurrent()")
174191
}
175192

176193
tree1 = interval.NewTree(cmpUintInterval, ivals[:2]...)
177194
tree2 = interval.NewTreeConcurrent(2, cmpUintInterval, ivals[:2]...)
178195

179-
if !equalStatistics(tree1, tree2) {
180-
t.Fatal("New() differs with NewConcurrent(), statistics differ")
196+
if !equalsSizeAndOrder(tree1, tree2) {
197+
t.Fatal("New() differs with NewConcurrent()")
181198
}
182199

183200
tree1 = interval.NewTree(cmpUintInterval, ivals[:30_000]...)
184201
tree2 = interval.NewTreeConcurrent(3, cmpUintInterval, ivals[:30_000]...)
185202

186-
if !equalStatistics(tree1, tree2) {
187-
t.Log(tree1.Statistics())
188-
t.Log(tree2.Statistics())
189-
t.Fatal("New() differs with NewConcurrent(), statistics differ")
203+
if !equalsSizeAndOrder(tree1, tree2) {
204+
t.Fatal("New() differs with NewConcurrent()")
190205
}
191206

192207
tree1 = interval.NewTree(cmpUintInterval, ivals...)
193-
tree2 = interval.NewTreeConcurrent(4, cmpUintInterval, ivals...)
208+
tree2 = interval.NewTreeConcurrent(runtime.NumCPU(), cmpUintInterval, ivals...)
194209

195-
if !equalStatistics(tree1, tree2) {
196-
t.Log(tree1.Statistics())
197-
t.Log(tree2.Statistics())
198-
t.Fatal("New() differs with NewConcurrent(), statistics differ")
210+
if !equalsSizeAndOrder(tree1, tree2) {
211+
t.Fatal("New() differs with NewConcurrent()")
199212
}
200213
}
201214

0 commit comments

Comments
 (0)