Skip to content

Commit 0149ca1

Browse files
committed
update timer
1 parent 215f3da commit 0149ca1

File tree

1 file changed

+84
-84
lines changed

1 file changed

+84
-84
lines changed

timer_ascii.md

Lines changed: 84 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -271,32 +271,32 @@ type timersBucket struct {
271271
四叉堆高度上比二叉堆要矮一些。一个节点的所有(最多有4个)孩子节点都比这个节点要大。一个节点的(只有一个)父节点一定比当前节点小。下面是填好值之后的一个典型的四叉堆:
272272

273273
```
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+
+-----+-----+-----+-----+ +-----+-----+-----+-----+
300300
```
301301

302302
和二叉堆一样,对于一个节点的要求只有和其父节点以及子节点之间的大小关系。相邻节点之间没有任何关系。
@@ -506,18 +506,18 @@ func timerproc(tb *timersBucket) {
506506
507507
when+period
508508
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
521521
522522
trigger trigger
523523
trigger trigger
@@ -604,55 +604,55 @@ func siftdownTimer(t []*timer, i int) {
604604
这段代码实在是称不上优雅,其实就是在所有孩子节点中先找出最小的那一个,如果最小的比当前要下移的节点还要大,那么就 break。反之,则将最小的节点上移,然后再判断这个最小节点的 4 个子节点是否都比要下移的节点大。以此类推。用图来模拟一下这个过程:
605605

606606
```
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
630630
631631
632632
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
656656
```
657657

658658
### 流程

0 commit comments

Comments
 (0)