github.com/mymmsc/gox@v1.3.33/util/redblacktree/redblacktree_test.go (about) 1 // Copyright (c) 2015, Emir Pasic. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package redblacktree 6 7 import ( 8 "fmt" 9 "testing" 10 ) 11 12 func TestRedBlackTreePut(t *testing.T) { 13 tree := NewWithIntComparator() 14 tree.Put(5, "e") 15 tree.Put(6, "f") 16 tree.Put(7, "g") 17 tree.Put(3, "c") 18 tree.Put(4, "d") 19 tree.Put(1, "x") 20 tree.Put(2, "b") 21 tree.Put(1, "a") //overwrite 22 23 if actualValue := tree.Size(); actualValue != 7 { 24 t.Errorf("Got %v expected %v", actualValue, 7) 25 } 26 if actualValue, expectedValue := fmt.Sprintf("%d%d%d%d%d%d%d", tree.Keys()...), "1234567"; actualValue != expectedValue { 27 t.Errorf("Got %v expected %v", actualValue, expectedValue) 28 } 29 if actualValue, expectedValue := fmt.Sprintf("%s%s%s%s%s%s%s", tree.Values()...), "abcdefg"; actualValue != expectedValue { 30 t.Errorf("Got %v expected %v", actualValue, expectedValue) 31 } 32 33 tests1 := [][]interface{}{ 34 {1, "a", true}, 35 {2, "b", true}, 36 {3, "c", true}, 37 {4, "d", true}, 38 {5, "e", true}, 39 {6, "f", true}, 40 {7, "g", true}, 41 {8, nil, false}, 42 } 43 44 for _, test := range tests1 { 45 // retrievals 46 actualValue, actualFound := tree.Get(test[0]) 47 if actualValue != test[1] || actualFound != test[2] { 48 t.Errorf("Got %v expected %v", actualValue, test[1]) 49 } 50 } 51 } 52 53 func TestRedBlackTreeRemove(t *testing.T) { 54 tree := NewWithIntComparator() 55 tree.Put(5, "e") 56 tree.Put(6, "f") 57 tree.Put(7, "g") 58 tree.Put(3, "c") 59 tree.Put(4, "d") 60 tree.Put(1, "x") 61 tree.Put(2, "b") 62 tree.Put(1, "a") //overwrite 63 64 tree.Remove(5) 65 tree.Remove(6) 66 tree.Remove(7) 67 tree.Remove(8) 68 tree.Remove(5) 69 70 if actualValue, expectedValue := fmt.Sprintf("%d%d%d%d", tree.Keys()...), "1234"; actualValue != expectedValue { 71 t.Errorf("Got %v expected %v", actualValue, expectedValue) 72 } 73 if actualValue, expectedValue := fmt.Sprintf("%s%s%s%s", tree.Values()...), "abcd"; actualValue != expectedValue { 74 t.Errorf("Got %v expected %v", actualValue, expectedValue) 75 } 76 if actualValue, expectedValue := fmt.Sprintf("%s%s%s%s", tree.Values()...), "abcd"; actualValue != expectedValue { 77 t.Errorf("Got %v expected %v", actualValue, expectedValue) 78 } 79 if actualValue := tree.Size(); actualValue != 4 { 80 t.Errorf("Got %v expected %v", actualValue, 7) 81 } 82 83 tests2 := [][]interface{}{ 84 {1, "a", true}, 85 {2, "b", true}, 86 {3, "c", true}, 87 {4, "d", true}, 88 {5, nil, false}, 89 {6, nil, false}, 90 {7, nil, false}, 91 {8, nil, false}, 92 } 93 94 for _, test := range tests2 { 95 actualValue, actualFound := tree.Get(test[0]) 96 if actualValue != test[1] || actualFound != test[2] { 97 t.Errorf("Got %v expected %v", actualValue, test[1]) 98 } 99 } 100 101 tree.Remove(1) 102 tree.Remove(4) 103 tree.Remove(2) 104 tree.Remove(3) 105 tree.Remove(2) 106 tree.Remove(2) 107 108 if actualValue, expectedValue := fmt.Sprintf("%s", tree.Keys()), "[]"; actualValue != expectedValue { 109 t.Errorf("Got %v expected %v", actualValue, expectedValue) 110 } 111 if actualValue, expectedValue := fmt.Sprintf("%s", tree.Values()), "[]"; actualValue != expectedValue { 112 t.Errorf("Got %v expected %v", actualValue, expectedValue) 113 } 114 if empty, size := tree.Empty(), tree.Size(); empty != true || size != -0 { 115 t.Errorf("Got %v expected %v", empty, true) 116 } 117 118 } 119 120 func TestRedBlackTreeLeftAndRight(t *testing.T) { 121 tree := NewWithIntComparator() 122 123 if actualValue := tree.Left(); actualValue != nil { 124 t.Errorf("Got %v expected %v", actualValue, nil) 125 } 126 if actualValue := tree.Right(); actualValue != nil { 127 t.Errorf("Got %v expected %v", actualValue, nil) 128 } 129 130 tree.Put(1, "a") 131 tree.Put(5, "e") 132 tree.Put(6, "f") 133 tree.Put(7, "g") 134 tree.Put(3, "c") 135 tree.Put(4, "d") 136 tree.Put(1, "x") // overwrite 137 tree.Put(2, "b") 138 139 if actualValue, expectedValue := fmt.Sprintf("%d", tree.Left().Key), "1"; actualValue != expectedValue { 140 t.Errorf("Got %v expected %v", actualValue, expectedValue) 141 } 142 if actualValue, expectedValue := fmt.Sprintf("%s", tree.Left().Value), "x"; actualValue != expectedValue { 143 t.Errorf("Got %v expected %v", actualValue, expectedValue) 144 } 145 146 if actualValue, expectedValue := fmt.Sprintf("%d", tree.Right().Key), "7"; actualValue != expectedValue { 147 t.Errorf("Got %v expected %v", actualValue, expectedValue) 148 } 149 if actualValue, expectedValue := fmt.Sprintf("%s", tree.Right().Value), "g"; actualValue != expectedValue { 150 t.Errorf("Got %v expected %v", actualValue, expectedValue) 151 } 152 } 153 154 func TestRedBlackTreeCeilingAndFloor(t *testing.T) { 155 tree := NewWithIntComparator() 156 157 if node, found := tree.Floor(0); node != nil || found { 158 t.Errorf("Got %v expected %v", node, "<nil>") 159 } 160 if node, found := tree.Ceiling(0); node != nil || found { 161 t.Errorf("Got %v expected %v", node, "<nil>") 162 } 163 164 tree.Put(5, "e") 165 tree.Put(6, "f") 166 tree.Put(7, "g") 167 tree.Put(3, "c") 168 tree.Put(4, "d") 169 tree.Put(1, "x") 170 tree.Put(2, "b") 171 172 if node, found := tree.Floor(4); node.Key != 4 || !found { 173 t.Errorf("Got %v expected %v", node.Key, 4) 174 } 175 if node, found := tree.Floor(0); node != nil || found { 176 t.Errorf("Got %v expected %v", node, "<nil>") 177 } 178 179 if node, found := tree.Ceiling(4); node.Key != 4 || !found { 180 t.Errorf("Got %v expected %v", node.Key, 4) 181 } 182 if node, found := tree.Ceiling(8); node != nil || found { 183 t.Errorf("Got %v expected %v", node, "<nil>") 184 } 185 } 186 187 func TestRedBlackTreeIteratorNextOnEmpty(t *testing.T) { 188 tree := NewWithIntComparator() 189 it := tree.Iterator() 190 for it.Next() { 191 t.Errorf("Shouldn't iterate on empty tree") 192 } 193 } 194 195 func TestRedBlackTreeIteratorPrevOnEmpty(t *testing.T) { 196 tree := NewWithIntComparator() 197 it := tree.Iterator() 198 for it.Prev() { 199 t.Errorf("Shouldn't iterate on empty tree") 200 } 201 } 202 203 func TestRedBlackTreeIterator1Next(t *testing.T) { 204 tree := NewWithIntComparator() 205 tree.Put(5, "e") 206 tree.Put(6, "f") 207 tree.Put(7, "g") 208 tree.Put(3, "c") 209 tree.Put(4, "d") 210 tree.Put(1, "x") 211 tree.Put(2, "b") 212 tree.Put(1, "a") //overwrite 213 // │ ┌── 7 214 // └── 6 215 // │ ┌── 5 216 // └── 4 217 // │ ┌── 3 218 // └── 2 219 // └── 1 220 it := tree.Iterator() 221 count := 0 222 for it.Next() { 223 count++ 224 key := it.Key() 225 switch key { 226 case count: 227 if actualValue, expectedValue := key, count; actualValue != expectedValue { 228 t.Errorf("Got %v expected %v", actualValue, expectedValue) 229 } 230 default: 231 if actualValue, expectedValue := key, count; actualValue != expectedValue { 232 t.Errorf("Got %v expected %v", actualValue, expectedValue) 233 } 234 } 235 } 236 if actualValue, expectedValue := count, tree.Size(); actualValue != expectedValue { 237 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 238 } 239 } 240 241 func TestRedBlackTreeIterator1Prev(t *testing.T) { 242 tree := NewWithIntComparator() 243 tree.Put(5, "e") 244 tree.Put(6, "f") 245 tree.Put(7, "g") 246 tree.Put(3, "c") 247 tree.Put(4, "d") 248 tree.Put(1, "x") 249 tree.Put(2, "b") 250 tree.Put(1, "a") //overwrite 251 // │ ┌── 7 252 // └── 6 253 // │ ┌── 5 254 // └── 4 255 // │ ┌── 3 256 // └── 2 257 // └── 1 258 it := tree.Iterator() 259 for it.Next() { 260 } 261 countDown := tree.size 262 for it.Prev() { 263 key := it.Key() 264 switch key { 265 case countDown: 266 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 267 t.Errorf("Got %v expected %v", actualValue, expectedValue) 268 } 269 default: 270 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 271 t.Errorf("Got %v expected %v", actualValue, expectedValue) 272 } 273 } 274 countDown-- 275 } 276 if actualValue, expectedValue := countDown, 0; actualValue != expectedValue { 277 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 278 } 279 } 280 281 func TestRedBlackTreeIterator2Next(t *testing.T) { 282 tree := NewWithIntComparator() 283 tree.Put(3, "c") 284 tree.Put(1, "a") 285 tree.Put(2, "b") 286 it := tree.Iterator() 287 count := 0 288 for it.Next() { 289 count++ 290 key := it.Key() 291 switch key { 292 case count: 293 if actualValue, expectedValue := key, count; actualValue != expectedValue { 294 t.Errorf("Got %v expected %v", actualValue, expectedValue) 295 } 296 default: 297 if actualValue, expectedValue := key, count; actualValue != expectedValue { 298 t.Errorf("Got %v expected %v", actualValue, expectedValue) 299 } 300 } 301 } 302 if actualValue, expectedValue := count, tree.Size(); actualValue != expectedValue { 303 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 304 } 305 } 306 307 func TestRedBlackTreeIterator2Prev(t *testing.T) { 308 tree := NewWithIntComparator() 309 tree.Put(3, "c") 310 tree.Put(1, "a") 311 tree.Put(2, "b") 312 it := tree.Iterator() 313 for it.Next() { 314 } 315 countDown := tree.size 316 for it.Prev() { 317 key := it.Key() 318 switch key { 319 case countDown: 320 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 321 t.Errorf("Got %v expected %v", actualValue, expectedValue) 322 } 323 default: 324 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 325 t.Errorf("Got %v expected %v", actualValue, expectedValue) 326 } 327 } 328 countDown-- 329 } 330 if actualValue, expectedValue := countDown, 0; actualValue != expectedValue { 331 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 332 } 333 } 334 335 func TestRedBlackTreeIterator3Next(t *testing.T) { 336 tree := NewWithIntComparator() 337 tree.Put(1, "a") 338 it := tree.Iterator() 339 count := 0 340 for it.Next() { 341 count++ 342 key := it.Key() 343 switch key { 344 case count: 345 if actualValue, expectedValue := key, count; actualValue != expectedValue { 346 t.Errorf("Got %v expected %v", actualValue, expectedValue) 347 } 348 default: 349 if actualValue, expectedValue := key, count; actualValue != expectedValue { 350 t.Errorf("Got %v expected %v", actualValue, expectedValue) 351 } 352 } 353 } 354 if actualValue, expectedValue := count, tree.Size(); actualValue != expectedValue { 355 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 356 } 357 } 358 359 func TestRedBlackTreeIterator3Prev(t *testing.T) { 360 tree := NewWithIntComparator() 361 tree.Put(1, "a") 362 it := tree.Iterator() 363 for it.Next() { 364 } 365 countDown := tree.size 366 for it.Prev() { 367 key := it.Key() 368 switch key { 369 case countDown: 370 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 371 t.Errorf("Got %v expected %v", actualValue, expectedValue) 372 } 373 default: 374 if actualValue, expectedValue := key, countDown; actualValue != expectedValue { 375 t.Errorf("Got %v expected %v", actualValue, expectedValue) 376 } 377 } 378 countDown-- 379 } 380 if actualValue, expectedValue := countDown, 0; actualValue != expectedValue { 381 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 382 } 383 } 384 385 func TestRedBlackTreeIterator4Next(t *testing.T) { 386 tree := NewWithIntComparator() 387 tree.Put(13, 5) 388 tree.Put(8, 3) 389 tree.Put(17, 7) 390 tree.Put(1, 1) 391 tree.Put(11, 4) 392 tree.Put(15, 6) 393 tree.Put(25, 9) 394 tree.Put(6, 2) 395 tree.Put(22, 8) 396 tree.Put(27, 10) 397 // │ ┌── 27 398 // │ ┌── 25 399 // │ │ └── 22 400 // │ ┌── 17 401 // │ │ └── 15 402 // └── 13 403 // │ ┌── 11 404 // └── 8 405 // │ ┌── 6 406 // └── 1 407 it := tree.Iterator() 408 count := 0 409 for it.Next() { 410 count++ 411 value := it.Value() 412 switch value { 413 case count: 414 if actualValue, expectedValue := value, count; actualValue != expectedValue { 415 t.Errorf("Got %v expected %v", actualValue, expectedValue) 416 } 417 default: 418 if actualValue, expectedValue := value, count; actualValue != expectedValue { 419 t.Errorf("Got %v expected %v", actualValue, expectedValue) 420 } 421 } 422 } 423 if actualValue, expectedValue := count, tree.Size(); actualValue != expectedValue { 424 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 425 } 426 } 427 428 func TestRedBlackTreeIterator4Prev(t *testing.T) { 429 tree := NewWithIntComparator() 430 tree.Put(13, 5) 431 tree.Put(8, 3) 432 tree.Put(17, 7) 433 tree.Put(1, 1) 434 tree.Put(11, 4) 435 tree.Put(15, 6) 436 tree.Put(25, 9) 437 tree.Put(6, 2) 438 tree.Put(22, 8) 439 tree.Put(27, 10) 440 // │ ┌── 27 441 // │ ┌── 25 442 // │ │ └── 22 443 // │ ┌── 17 444 // │ │ └── 15 445 // └── 13 446 // │ ┌── 11 447 // └── 8 448 // │ ┌── 6 449 // └── 1 450 it := tree.Iterator() 451 count := tree.Size() 452 for it.Next() { 453 } 454 for it.Prev() { 455 value := it.Value() 456 switch value { 457 case count: 458 if actualValue, expectedValue := value, count; actualValue != expectedValue { 459 t.Errorf("Got %v expected %v", actualValue, expectedValue) 460 } 461 default: 462 if actualValue, expectedValue := value, count; actualValue != expectedValue { 463 t.Errorf("Got %v expected %v", actualValue, expectedValue) 464 } 465 } 466 count-- 467 } 468 if actualValue, expectedValue := count, 0; actualValue != expectedValue { 469 t.Errorf("Size different. Got %v expected %v", actualValue, expectedValue) 470 } 471 } 472 473 func TestRedBlackTreeIteratorBegin(t *testing.T) { 474 tree := NewWithIntComparator() 475 tree.Put(3, "c") 476 tree.Put(1, "a") 477 tree.Put(2, "b") 478 it := tree.Iterator() 479 480 if it.node != nil { 481 t.Errorf("Got %v expected %v", it.node, nil) 482 } 483 484 it.Begin() 485 486 if it.node != nil { 487 t.Errorf("Got %v expected %v", it.node, nil) 488 } 489 490 for it.Next() { 491 } 492 493 it.Begin() 494 495 if it.node != nil { 496 t.Errorf("Got %v expected %v", it.node, nil) 497 } 498 499 it.Next() 500 if key, value := it.Key(), it.Value(); key != 1 || value != "a" { 501 t.Errorf("Got %v,%v expected %v,%v", key, value, 1, "a") 502 } 503 } 504 505 func TestRedBlackTreeIteratorEnd(t *testing.T) { 506 tree := NewWithIntComparator() 507 it := tree.Iterator() 508 509 if it.node != nil { 510 t.Errorf("Got %v expected %v", it.node, nil) 511 } 512 513 it.End() 514 if it.node != nil { 515 t.Errorf("Got %v expected %v", it.node, nil) 516 } 517 518 tree.Put(3, "c") 519 tree.Put(1, "a") 520 tree.Put(2, "b") 521 it.End() 522 if it.node != nil { 523 t.Errorf("Got %v expected %v", it.node, nil) 524 } 525 526 it.Prev() 527 if key, value := it.Key(), it.Value(); key != 3 || value != "c" { 528 t.Errorf("Got %v,%v expected %v,%v", key, value, 3, "c") 529 } 530 } 531 532 func TestRedBlackTreeIteratorFirst(t *testing.T) { 533 tree := NewWithIntComparator() 534 tree.Put(3, "c") 535 tree.Put(1, "a") 536 tree.Put(2, "b") 537 it := tree.Iterator() 538 if actualValue, expectedValue := it.First(), true; actualValue != expectedValue { 539 t.Errorf("Got %v expected %v", actualValue, expectedValue) 540 } 541 if key, value := it.Key(), it.Value(); key != 1 || value != "a" { 542 t.Errorf("Got %v,%v expected %v,%v", key, value, 1, "a") 543 } 544 } 545 546 func TestRedBlackTreeIteratorLast(t *testing.T) { 547 tree := NewWithIntComparator() 548 tree.Put(3, "c") 549 tree.Put(1, "a") 550 tree.Put(2, "b") 551 it := tree.Iterator() 552 if actualValue, expectedValue := it.Last(), true; actualValue != expectedValue { 553 t.Errorf("Got %v expected %v", actualValue, expectedValue) 554 } 555 if key, value := it.Key(), it.Value(); key != 3 || value != "c" { 556 t.Errorf("Got %v,%v expected %v,%v", key, value, 3, "c") 557 } 558 } 559 560 func TestRedBlackTreeSerialization(t *testing.T) { 561 tree := NewWithStringComparator() 562 tree.Put("c", "3") 563 tree.Put("b", "2") 564 tree.Put("a", "1") 565 566 var err error 567 assert := func() { 568 if actualValue, expectedValue := tree.Size(), 3; actualValue != expectedValue { 569 t.Errorf("Got %v expected %v", actualValue, expectedValue) 570 } 571 if actualValue := tree.Keys(); actualValue[0].(string) != "a" || actualValue[1].(string) != "b" || actualValue[2].(string) != "c" { 572 t.Errorf("Got %v expected %v", actualValue, "[a,b,c]") 573 } 574 if actualValue := tree.Values(); actualValue[0].(string) != "1" || actualValue[1].(string) != "2" || actualValue[2].(string) != "3" { 575 t.Errorf("Got %v expected %v", actualValue, "[1,2,3]") 576 } 577 if err != nil { 578 t.Errorf("Got error %v", err) 579 } 580 } 581 582 assert() 583 584 json, err := tree.ToJSON() 585 assert() 586 587 err = tree.FromJSON(json) 588 assert() 589 } 590 591 func benchmarkGet(b *testing.B, tree *Tree, size int) { 592 for i := 0; i < b.N; i++ { 593 for n := 0; n < size; n++ { 594 tree.Get(n) 595 } 596 } 597 } 598 599 func benchmarkPut(b *testing.B, tree *Tree, size int) { 600 for i := 0; i < b.N; i++ { 601 for n := 0; n < size; n++ { 602 tree.Put(n, struct{}{}) 603 } 604 } 605 } 606 607 func benchmarkRemove(b *testing.B, tree *Tree, size int) { 608 for i := 0; i < b.N; i++ { 609 for n := 0; n < size; n++ { 610 tree.Remove(n) 611 } 612 } 613 } 614 615 func BenchmarkRedBlackTreeGet100(b *testing.B) { 616 b.StopTimer() 617 size := 100 618 tree := NewWithIntComparator() 619 for n := 0; n < size; n++ { 620 tree.Put(n, struct{}{}) 621 } 622 b.StartTimer() 623 benchmarkGet(b, tree, size) 624 } 625 626 func BenchmarkRedBlackTreeGet1000(b *testing.B) { 627 b.StopTimer() 628 size := 1000 629 tree := NewWithIntComparator() 630 for n := 0; n < size; n++ { 631 tree.Put(n, struct{}{}) 632 } 633 b.StartTimer() 634 benchmarkGet(b, tree, size) 635 } 636 637 func BenchmarkRedBlackTreeGet10000(b *testing.B) { 638 b.StopTimer() 639 size := 10000 640 tree := NewWithIntComparator() 641 for n := 0; n < size; n++ { 642 tree.Put(n, struct{}{}) 643 } 644 b.StartTimer() 645 benchmarkGet(b, tree, size) 646 } 647 648 func BenchmarkRedBlackTreeGet100000(b *testing.B) { 649 b.StopTimer() 650 size := 100000 651 tree := NewWithIntComparator() 652 for n := 0; n < size; n++ { 653 tree.Put(n, struct{}{}) 654 } 655 b.StartTimer() 656 benchmarkGet(b, tree, size) 657 } 658 659 func BenchmarkRedBlackTreePut100(b *testing.B) { 660 b.StopTimer() 661 size := 100 662 tree := NewWithIntComparator() 663 b.StartTimer() 664 benchmarkPut(b, tree, size) 665 } 666 667 func BenchmarkRedBlackTreePut1000(b *testing.B) { 668 b.StopTimer() 669 size := 1000 670 tree := NewWithIntComparator() 671 for n := 0; n < size; n++ { 672 tree.Put(n, struct{}{}) 673 } 674 b.StartTimer() 675 benchmarkPut(b, tree, size) 676 } 677 678 func BenchmarkRedBlackTreePut10000(b *testing.B) { 679 b.StopTimer() 680 size := 10000 681 tree := NewWithIntComparator() 682 for n := 0; n < size; n++ { 683 tree.Put(n, struct{}{}) 684 } 685 b.StartTimer() 686 benchmarkPut(b, tree, size) 687 } 688 689 func BenchmarkRedBlackTreePut100000(b *testing.B) { 690 b.StopTimer() 691 size := 100000 692 tree := NewWithIntComparator() 693 for n := 0; n < size; n++ { 694 tree.Put(n, struct{}{}) 695 } 696 b.StartTimer() 697 benchmarkPut(b, tree, size) 698 } 699 700 func BenchmarkRedBlackTreeRemove100(b *testing.B) { 701 b.StopTimer() 702 size := 100 703 tree := NewWithIntComparator() 704 for n := 0; n < size; n++ { 705 tree.Put(n, struct{}{}) 706 } 707 b.StartTimer() 708 benchmarkRemove(b, tree, size) 709 } 710 711 func BenchmarkRedBlackTreeRemove1000(b *testing.B) { 712 b.StopTimer() 713 size := 1000 714 tree := NewWithIntComparator() 715 for n := 0; n < size; n++ { 716 tree.Put(n, struct{}{}) 717 } 718 b.StartTimer() 719 benchmarkRemove(b, tree, size) 720 } 721 722 func BenchmarkRedBlackTreeRemove10000(b *testing.B) { 723 b.StopTimer() 724 size := 10000 725 tree := NewWithIntComparator() 726 for n := 0; n < size; n++ { 727 tree.Put(n, struct{}{}) 728 } 729 b.StartTimer() 730 benchmarkRemove(b, tree, size) 731 } 732 733 func BenchmarkRedBlackTreeRemove100000(b *testing.B) { 734 b.StopTimer() 735 size := 100000 736 tree := NewWithIntComparator() 737 for n := 0; n < size; n++ { 738 tree.Put(n, struct{}{}) 739 } 740 b.StartTimer() 741 benchmarkRemove(b, tree, size) 742 }