@@ -271,32 +271,32 @@ type timersBucket struct {
271
271
四叉堆高度上比二叉堆要矮一些。一个节点的所有(最多有4个)孩子节点都比这个节点要大。一个节点的(只有一个)父节点一定比当前节点小。下面是填好值之后的一个典型的四叉堆:
272
272
273
273
```
274
- ┌─────┐
275
- │ │
276
- │ 0 │
277
- └─────┘
278
- │
279
- │
280
- │
281
- ▼
282
- ┌─────┬─────┬─────┬─────┐
283
- │ │ │ │ │
284
- │ 3 │ 2 │ 2 │ 10 │
285
- └─────┴─────┴─────┴─────┘
286
- │ │ │ │
287
- │ │ │ │
288
- ┌──────────┐ │ │ │ │
289
- ┌────────────────┤ 4*i+1 ├───────────────────────┘ │ │ └─────────────────────────────┐
290
- │ └──────────┘ ┌───────────────────┘ └───┐ │
291
- │ │ │ │
292
- │ │ │ │
293
- ▼ │ │ ▼
294
- ┌─────┬─────┬─────┬─────┐ │ │ ┌─────┬─────┬─────┬─────┐
295
- │ │ │ │ │ ▼ ▼ │ │ │ │ │
296
- │ 20 │ 4 │ 5 │ 13 │ ┌─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┐ │ 99 │ 13 │ 11 │ 12 │
297
- └─────┴─────┴─────┴─────┘ │ │ │ │ │ │ │ │ │ │ └─────┴─────┴─────┴─────┘
298
- │ 12 │ 14 │ 15 │ 16 │ │ 3 │ 10 │ 3 │ 3 │
299
- └─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┘
274
+ +-----+
275
+ | |
276
+ | 0 |
277
+ +-----+
278
+ |
279
+ |
280
+ |
281
+ v
282
+ +-----+-----+-----+-----+
283
+ | | | | |
284
+ | 3 | 2 | 2 | 10 |
285
+ +-----+-----+-----+-----+
286
+ | | | |
287
+ | | | |
288
+ +----------+ | | | |
289
+ +----------------+ 4*i+1 +-----------------------+ | | +-----------------------------+
290
+ | +----------+ +-------------------+ +---+ |
291
+ | | | |
292
+ | | | |
293
+ v | | v
294
+ +-----+-----+-----+-----+ | | +-----+-----+-----+-----+
295
+ | | | | | v v | | | | |
296
+ | 20 | 4 | 5 | 13 | +-----+-----+-----+-----+ +-----+-----+-----+-----+ | 99 | 13 | 11 | 12 |
297
+ +-----+-----+-----+-----+ | | | | | | | | | | +-----+-----+-----+-----+
298
+ | 12 | 14 | 15 | 16 | | 3 | 10 | 3 | 3 |
299
+ +-----+-----+-----+-----+ +-----+-----+-----+-----+
300
300
```
301
301
302
302
和二叉堆一样,对于一个节点的要求只有和其父节点以及子节点之间的大小关系。相邻节点之间没有任何关系。
@@ -506,18 +506,18 @@ func timerproc(tb *timersBucket) {
506
506
507
507
when+period
508
508
when+period*3
509
- │
510
- │ │
511
- │ │
512
- │ when+period*2│
513
- when │ │
514
- │ │ │
515
- │ │ │ │ .....
516
- │ │ │ │
517
- ┌───────────┐ │ │ │ │
518
- │ timeline ├────────────────────────┼───────┼───────┼───────┼─────────────────▷
519
- └───────────┘ │ │ │ │
520
- ▼ ▼ ▼ ▼
509
+ |
510
+ | |
511
+ | |
512
+ | when+period*2|
513
+ when | |
514
+ | | |
515
+ | | | | .....
516
+ | | | |
517
+ +-----------+ | | | |
518
+ | timeline +------------------------+-------+-------+-------+----------------->
519
+ +-----------+ | | | |
520
+ v v v v
521
521
522
522
trigger trigger
523
523
trigger trigger
@@ -604,55 +604,55 @@ func siftdownTimer(t []*timer, i int) {
604
604
这段代码实在是称不上优雅,其实就是在所有孩子节点中先找出最小的那一个,如果最小的比当前要下移的节点还要大,那么就 break。反之,则将最小的节点上移,然后再判断这个最小节点的 4 个子节点是否都比要下移的节点大。以此类推。用图来模拟一下这个过程:
605
605
606
606
```
607
- │ ┌───┐
608
- │ │ 5 │
609
- │ └───┘
610
- │ │
611
- │ ┌─────┘
612
- │ ▼
613
- │ ┌───┬───┳━━━┳───┐
614
- │ │ 7 │ 3 │ 2 ┃ 6 │
615
- │ └───┴───┻━━━┻───┘
616
- ┌───────────────────┐ │ │
617
- │ siftdownTimer │ │ └──────────┐
618
- └───────────────────┘ │ ▼
619
- .───────── . │ ┌───┬───┬───┳━━━┓
620
- ( before ) │ │ 4 │ 5 │ 9 │ 3 ┃
621
- `───────── ' │ └───┴───┴───┻━━━┛
622
- │ │
623
- │ └─────────────┐
624
- │ ▼
625
- │ ┌───┬───┬───┳━━━┓
626
- │ │ 6 │ 6 │ 6 │ 4 ┃
627
- │ └───┴───┴───┻━━━┛
628
- │
629
- ▼
607
+ | +---+
608
+ | | 5 |
609
+ | +---+
610
+ | |
611
+ | +-----+
612
+ | v
613
+ | +---+---+---+---+
614
+ | | 7 | 3 | 2 | 6 |
615
+ | +---+---+---+---+
616
+ +-------------------+ | |
617
+ | siftdownTimer | | +----------+
618
+ +-------------------+ | v
619
+ .--------- . | +---+---+---+---+
620
+ ( before ) | | 4 | 5 | 9 | 3 |
621
+ `--------- ' | +---+---+---+---+
622
+ | |
623
+ | +-------------+
624
+ | v
625
+ | +---+---+---+---+
626
+ | | 6 | 6 | 6 | 4 |
627
+ | +---+---+---+---+
628
+ |
629
+ v
630
630
631
631
632
632
633
- │ ┌───┐
634
- │ │ 2 │
635
- │ └───┘
636
- │ │
637
- │ ┌─────┘
638
- │ ▼
639
- │ ┌───┬───┳━━━┳───┐
640
- │ │ 7 │ 3 │ 3 ┃ 6 │
641
- │ └───┴───┻━━━┻───┘
642
- ┌───────────────────┐ │ │
643
- │ siftdownTimer │ │ └──────────┐
644
- └───────────────────┘ │ ▼
645
- .───────── . │ ┌───┬───┬───┳━━━┓
646
- ( after ) │ │ 4 │ 5 │ 9 │ 4 ┃
647
- `───────── ' │ └───┴───┴───┻━━━┛
648
- │ │
649
- │ └─────────────┐
650
- │ ▼
651
- │ ┌───┬───┬───┳━━━┓
652
- │ │ 6 │ 6 │ 6 │ 5 ┃
653
- │ └───┴───┴───┻━━━┛
654
- │
655
- ▼
633
+ | +---+
634
+ | | 2 |
635
+ | +---+
636
+ | |
637
+ | +-----+
638
+ | v
639
+ | +---+---+---+---+
640
+ | | 7 | 3 | 3 | 6 |
641
+ | +---+---+---+---+
642
+ +-------------------+ | |
643
+ | siftdownTimer | | +----------+
644
+ +-------------------+ | v
645
+ .--------- . | +---+---+---+---+
646
+ ( after ) | | 4 | 5 | 9 | 4 |
647
+ `--------- ' | +---+---+---+---+
648
+ | |
649
+ | +-------------+
650
+ | v
651
+ | +---+---+---+---+
652
+ | | 6 | 6 | 6 | 5 |
653
+ | +---+---+---+---+
654
+ |
655
+ v
656
656
```
657
657
658
658
### 流程
0 commit comments