Skip to content

Commit e58f9b1

Browse files
authored
Change api (#7)
* avltree修改完成 * btree 修改 * linkedlist * rbtree接口修改完 * skip 接口修改完成
1 parent 813987a commit e58f9b1

File tree

16 files changed

+164
-178
lines changed

16 files changed

+164
-178
lines changed

api/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ type Map[K constraints.Ordered, V any] interface {
66
// 获取
77
Get(k K) (elem V)
88
// 获取
9-
GetWithErr(k K) (elem V, err error)
9+
GetWithBool(k K) (elem V, ok bool)
1010
// 删除
1111
Delete(k K)
1212
// 设置

avltree/avltree.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package avltree
55
// 参考资料
66
// https://github.com/skywind3000/avlmini
77
import (
8-
"errors"
98
"fmt"
109

1110
"github.com/antlabs/gstl/api"
@@ -14,8 +13,6 @@ import (
1413
"golang.org/x/exp/constraints"
1514
)
1615

17-
var ErrNotFound = errors.New("avltree: not found value")
18-
1916
var _ api.SortedMap[int, int] = (*AvlTree[int, int])(nil)
2017

2118
// 元素
@@ -191,47 +188,47 @@ func New[K constraints.Ordered, V any]() *AvlTree[K, V] {
191188
}
192189

193190
// 第一个节点
194-
func (a *AvlTree[K, V]) First() (v V, err error) {
191+
func (a *AvlTree[K, V]) First() (v V, ok bool) {
195192
n := a.root.node
196193
if n == nil {
197-
err = ErrNotFound
194+
ok = false
198195
return
199196
}
200197

201198
for n.left != nil {
202199
n = n.left
203200
}
204201

205-
return n.val, nil
202+
return n.val, true
206203
}
207204

208205
// 最后一个节点
209-
func (a *AvlTree[K, V]) Last() (v V, err error) {
206+
func (a *AvlTree[K, V]) Last() (v V, ok bool) {
210207
n := a.root.node
211208
if n == nil {
212-
err = ErrNotFound
209+
ok = false
213210
return
214211
}
215212

216213
for n.right != nil {
217214
n = n.right
218215
}
219216

220-
return n.val, nil
217+
return n.val, true
221218
}
222219

223220
// Get
224221
func (a *AvlTree[K, V]) Get(k K) (v V) {
225-
v, _ = a.GetWithErr(k)
222+
v, _ = a.GetWithBool(k)
226223
return
227224
}
228225

229226
// 从avl tree找到需要的值
230-
func (a *AvlTree[K, V]) GetWithErr(k K) (v V, err error) {
227+
func (a *AvlTree[K, V]) GetWithBool(k K) (v V, ok bool) {
231228
n := a.root.node
232229
for n != nil {
233230
if n.key == k {
234-
return n.val, nil
231+
return n.val, true
235232
}
236233

237234
if k > n.key {
@@ -241,7 +238,6 @@ func (a *AvlTree[K, V]) GetWithErr(k K) (v V, err error) {
241238
}
242239
}
243240

244-
err = ErrNotFound
245241
return
246242
}
247243

avltree/avltree_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ func Test_SetAndGet(t *testing.T) {
1818
}
1919

2020
for i := 0; i < max; i++ {
21-
v, err := b.GetWithErr(i)
22-
assert.NoError(t, err)
21+
v, ok := b.GetWithBool(i)
22+
assert.True(t, ok)
2323
assert.Equal(t, v, i)
2424
}
2525
}
@@ -33,8 +33,8 @@ func Test_SetAndGet2(t *testing.T) {
3333
}
3434

3535
for i := max; i >= 0; i-- {
36-
v, err := b.GetWithErr(i)
37-
assert.NoError(t, err)
36+
v, ok := b.GetWithBool(i)
37+
assert.True(t, ok)
3838
assert.Equal(t, v, i)
3939
}
4040
}
@@ -57,15 +57,15 @@ func Test_AVLTree_Delete1(t *testing.T) {
5757

5858
// max/2-max应该能找到
5959
for i := max / 2; i < max; i++ {
60-
v, err := b.GetWithErr(i)
61-
assert.NoError(t, err, fmt.Sprintf("index:%d", i))
60+
v, ok := b.GetWithBool(i)
61+
assert.True(t, ok, fmt.Sprintf("index:%d", i))
6262
assert.Equal(t, v, i, fmt.Sprintf("index:%d", i))
6363
}
6464

6565
// 0-max/2应该找不到
6666
for i := 0; i < max/2; i++ {
67-
v, err := b.GetWithErr(i)
68-
assert.Error(t, err, fmt.Sprintf("index:%d", i))
67+
v, ok := b.GetWithBool(i)
68+
assert.False(t, ok, fmt.Sprintf("index:%d", i))
6969
assert.Equal(t, v, 0, fmt.Sprintf("index:%d", i))
7070
}
7171
}

btree/btree.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package btree
55
// 参考资料
66
// https://github.com/tidwall/btree
77
import (
8-
"errors"
98
"fmt"
109

1110
"github.com/antlabs/gstl/api"
@@ -15,7 +14,7 @@ import (
1514
)
1615

1716
var _ api.SortedMap[int, int] = (*Btree[int, int])(nil)
18-
var ErrNotFound = errors.New("btree not found")
17+
var notFound = "not found element"
1918

2019
// btree头结点
2120
type Btree[K constraints.Ordered, V any] struct {
@@ -198,27 +197,25 @@ func (b *Btree[K, V]) SetWithPrev(k K, v V) (prev V, replaced bool) {
198197

199198
// 获取值, 忽略找不到的情况
200199
func (b *Btree[K, V]) Get(k K) (v V) {
201-
v, _ = b.GetWithErr(k)
200+
v, _ = b.GetWithBool(k)
202201
return
203202
}
204203

205-
// 找到err为nil
206-
// 找不到err为ErrNotFound
207-
func (b *Btree[K, V]) GetWithErr(k K) (v V, err error) {
204+
// 找到ok为true
205+
// 找不到ok为false
206+
func (b *Btree[K, V]) GetWithBool(k K) (v V, ok bool) {
208207
if b.root == nil {
209-
err = ErrNotFound
210208
return
211209
}
212210

213211
n := b.root
214212
for {
215213
i, found := b.find(n, k)
216214
if found {
217-
return n.items.Get(i).val, nil
215+
return n.items.Get(i).val, true
218216
}
219217

220218
if n.leaf() {
221-
err = ErrNotFound
222219
return
223220
}
224221

@@ -243,10 +240,10 @@ func (b *Btree[K, V]) DeleteWithPrev(k K) (prev V, deleted bool) {
243240
}
244241

245242
if b.root.items.Len() == 0 && !b.root.leaf() {
246-
var err error
247-
b.root, err = b.root.children.First()
248-
if err != nil {
249-
panic(err.Error())
243+
var ok bool
244+
b.root, ok = b.root.children.First()
245+
if !ok {
246+
panic("not found first element")
250247
}
251248
}
252249

@@ -336,19 +333,19 @@ func (b *Btree[K, V]) rebalance(n *node[K, V], i int) {
336333
// 父到右
337334
right.items.Insert(0, n.items.Get(i))
338335
// 左边最后一个当父
339-
last, err := left.items.Pop()
340-
if err != nil {
341-
panic(err.Error())
336+
last, ok := left.items.Pop()
337+
if !ok {
338+
panic(notFound)
342339
}
343340

344341
// last是从左叶子最后一个元素借过来的
345342
n.items.Set(i, last)
346343

347344
if !left.leaf() {
348345

349-
last, err := left.children.Pop()
350-
if err != nil {
351-
panic(err.Error())
346+
last, ok := left.children.Pop()
347+
if !ok {
348+
panic(notFound)
352349
}
353350
right.children.Insert(0, last)
354351
}
@@ -358,18 +355,18 @@ func (b *Btree[K, V]) rebalance(n *node[K, V], i int) {
358355
// 左叶先合并父
359356
left.items.Push(n.items.Get(i))
360357
// 向右边借最左边的元素当父
361-
first, err := right.items.PopFront()
362-
if err != nil {
363-
panic(err.Error())
358+
first, ok := right.items.PopFront()
359+
if !ok {
360+
panic(notFound)
364361
}
365362

366363
// first是和右叶子借过来的
367364
n.items.Set(i, first)
368365

369366
if !left.leaf() {
370-
first, err := right.children.PopFront()
371-
if err != nil {
372-
panic(err.Error())
367+
first, ok := right.children.PopFront()
368+
if !ok {
369+
panic(notFound)
373370
}
374371

375372
left.children.Push(first)
@@ -468,7 +465,7 @@ func (n *node[K, V]) rangeInner(callback func(k K, v V) bool) bool {
468465
}
469466

470467
// n.children比n.items多一个元素. 这里不能漏掉
471-
return must.TakeOne(n.children.Last()).rangeInner(callback)
468+
return must.TakeOneDiscardBool(n.children.Last()).rangeInner(callback)
472469
}
473470

474471
// 从后向前倒序遍历b tree
@@ -499,7 +496,7 @@ func (n *node[K, V]) rangePrevInner(callback func(k K, v V) bool) bool {
499496

500497
// 先右
501498
if n.children != nil {
502-
if !must.TakeOne(n.children.Last()).rangePrevInner(callback) {
499+
if !must.TakeOneDiscardBool(n.children.Last()).rangePrevInner(callback) {
503500
return false
504501
}
505502
}

btree/btree_test.go

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ func Test_Btree_SetAndGet(t *testing.T) {
2020
}
2121

2222
for i := 0; i < max; i++ {
23-
v, err := b.GetWithErr(i)
24-
assert.NoError(t, err)
23+
v, ok := b.GetWithBool(i)
24+
assert.True(t, ok)
2525
assert.Equal(t, v, i)
2626
}
2727
}
@@ -37,8 +37,8 @@ func Test_Btree_SetAndGet_Split(t *testing.T) {
3737
}
3838

3939
for i := 0; i < max; i++ {
40-
v, err := b.GetWithErr(i)
41-
assert.NoError(t, err, fmt.Sprintf("index:%d", i))
40+
v, ok := b.GetWithBool(i)
41+
assert.True(t, ok, fmt.Sprintf("index:%d", i))
4242
assert.Equal(t, v, i, fmt.Sprintf("index:%d", i))
4343
}
4444
}
@@ -54,8 +54,8 @@ func Test_Btree_SetAndGet_Split_Big(t *testing.T) {
5454
}
5555

5656
for i := 0; i < max; i++ {
57-
v, err := b.GetWithErr(i)
58-
assert.NoError(t, err, fmt.Sprintf("index:%d", i))
57+
v, ok := b.GetWithBool(i)
58+
assert.True(t, ok, fmt.Sprintf("index:%d", i))
5959
assert.Equal(t, v, i, fmt.Sprintf("index:%d", i))
6060
}
6161
}
@@ -76,8 +76,8 @@ func Test_Btree_SetAndGet_Replace(t *testing.T) {
7676
}
7777

7878
for i := 0; i < max; i++ {
79-
v, err := b.GetWithErr(i)
80-
assert.NoError(t, err, fmt.Sprintf("index:%d", i))
79+
v, ok := b.GetWithBool(i)
80+
assert.True(t, ok, fmt.Sprintf("index:%d", i))
8181
assert.Equal(t, v, i+1, fmt.Sprintf("index:%d", i))
8282
}
8383
}
@@ -312,15 +312,15 @@ func Test_Btree_Delete1(t *testing.T) {
312312

313313
// max/2-max应该能找到
314314
for i := max / 2; i < max; i++ {
315-
v, err := b.GetWithErr(i)
316-
assert.NoError(t, err, fmt.Sprintf("index:%d", i))
315+
v, ok := b.GetWithBool(i)
316+
assert.True(t, ok, fmt.Sprintf("index:%d", i))
317317
assert.Equal(t, v, i, fmt.Sprintf("index:%d", i))
318318
}
319319

320320
// 0-max/2应该找不到
321321
for i := 0; i < max/2; i++ {
322-
v, err := b.GetWithErr(i)
323-
assert.Error(t, err, fmt.Sprintf("index:%d", i))
322+
v, ok := b.GetWithBool(i)
323+
assert.False(t, ok, fmt.Sprintf("index:%d", i))
324324
assert.Equal(t, v, 0, fmt.Sprintf("index:%d", i))
325325
}
326326
}
@@ -360,17 +360,16 @@ func Test_Btree_Delete2(t *testing.T) {
360360

361361
// 查找后半段, 应该找不到
362362
for i := start; i < max; i++ {
363-
v, err := b.GetWithErr(i)
364-
assert.Error(t, err, fmt.Sprintf("index:%d", i))
363+
v, ok := b.GetWithBool(i)
364+
assert.False(t, ok, fmt.Sprintf("index:%d", i))
365365
assert.Equal(t, v, 0, fmt.Sprintf("index:%d", i))
366366
}
367367

368368
// 查找前半段
369369
for i := 0; i < start; i++ {
370-
v, err := b.GetWithErr(i)
371-
assert.NoError(t, err, fmt.Sprintf("index:%d, max:%d, delete-start:%d", i, max, start))
372-
if err != nil {
373-
fmt.Println(b.GetWithErr(i))
370+
v, ok := b.GetWithBool(i)
371+
assert.True(t, ok, fmt.Sprintf("index:%d, max:%d, delete-start:%d", i, max, start))
372+
if !ok {
374373
return
375374
}
376375

0 commit comments

Comments
 (0)