Skip to content

Commit ccdaa65

Browse files
committed
Adding constant count support.
1 parent fc20db6 commit ccdaa65

File tree

6 files changed

+63
-46
lines changed

6 files changed

+63
-46
lines changed

balance-inlined.ts

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,44 @@
1-
/**
2-
* Inlined version, small improvement, 1mln random integer inserts:
3-
*
4-
* 1.83s
5-
* rss 248.05 MB
6-
* heapTotal 219.61 MB
7-
* heapUsed 117.88 MB
8-
* external 0.25 MB
9-
* arrayBuffers 0.01 MB
10-
*
11-
* vs original:
12-
*
13-
* 1.85s
14-
* rss 248.34 MB
15-
* heapTotal 219.36 MB
16-
* heapUsed 126.33 MB
17-
* external 0.25 MB
18-
* arrayBuffers 0.01 MB
19-
*
20-
*/
1+
// /**
2+
// * Inlined version, small improvement, 1mln random integer inserts:
3+
// *
4+
// * 1.83s
5+
// * rss 248.05 MB
6+
// * heapTotal 219.61 MB
7+
// * heapUsed 117.88 MB
8+
// * external 0.25 MB
9+
// * arrayBuffers 0.01 MB
10+
// *
11+
// * vs original:
12+
// *
13+
// * 1.85s
14+
// * rss 248.34 MB
15+
// * heapTotal 219.36 MB
16+
// * heapUsed 126.33 MB
17+
// * external 0.25 MB
18+
// * arrayBuffers 0.01 MB
19+
// *
20+
// */
2121

22-
import { R, B, BB, M } from './prelude.js'
22+
// import { R, B, BB, M } from './prelude.js'
2323

24-
const balance =
25-
<T>(_: M<T>): M<T> => {
26-
switch (true) {
27-
case _.c === B && _.l?.c === R && _.l.l?.c === R:
28-
return { c: R, l: { c: B, l: _.l!.l!.l, v: _.l!.l!.v, r: _.l!.l!.r }, v: _.l!.v, r: { c: B, l: _.l!.r, v: _.v, r: _.r } }
29-
case _.c === B && _.l?.c === R && _.l.r?.c === R:
30-
return { c: R, l: { c: B, l: _.l!.l, v: _.l!.v, r: _.l!.r!.l }, v: _.l!.r!.v, r: { c: B, l: _.l!.r!.r, v: _.v, r: _.r } }
31-
case _.c === B && _.r?.c === R && _.r.l?.c === R:
32-
return { c: R, l: { c: B, l: _.l, v: _.v, r: _.r!.l!.l }, v: _.r!.l!.v, r: { c: B, l: _.r!.l!.r, v: _.r!.v, r: _.r!.r } }
33-
case _.c === B && _.r?.c === R && _.r.r?.c === R:
34-
return { c: R, l: { c: B, l: _.l, v: _.v, r: _.r!.l }, v: _.r!.v, r: { c: B, l: _.r!.r!.l, v: _.r!.r!.v, r: _.r!.r!.r } }
35-
case _.c === BB && _.r?.c === R && _.r.l?.c === R:
36-
return { c: B, l: { c: B, l: _.l, v: _.v, r: _.r!.l!.l }, v: _.r!.l!.v, r: { c: B, l: _.r!.l!.r, v: _.r!.v, r: _.r!.r } }
37-
case _.c === BB && _.l?.c === R && _.l.r?.c === R:
38-
return { c: B, l: { c: B, l: _.l!.l, v: _.l!.v, r: _.l!.r!.l }, v: _.l!.r!.v, r: { c: B, l: _.l!.r!.r, v: _.v, r: _.r } }
39-
default:
40-
return _
41-
}
42-
}
24+
// const balance =
25+
// <T>(_: M<T>): M<T> => {
26+
// switch (true) {
27+
// case _.c === B && _.l?.c === R && _.l.l?.c === R:
28+
// return { c: R, l: { c: B, l: _.l!.l!.l, v: _.l!.l!.v, r: _.l!.l!.r }, v: _.l!.v, r: { c: B, l: _.l!.r, v: _.v, r: _.r } }
29+
// case _.c === B && _.l?.c === R && _.l.r?.c === R:
30+
// return { c: R, l: { c: B, l: _.l!.l, v: _.l!.v, r: _.l!.r!.l }, v: _.l!.r!.v, r: { c: B, l: _.l!.r!.r, v: _.v, r: _.r } }
31+
// case _.c === B && _.r?.c === R && _.r.l?.c === R:
32+
// return { c: R, l: { c: B, l: _.l, v: _.v, r: _.r!.l!.l }, v: _.r!.l!.v, r: { c: B, l: _.r!.l!.r, v: _.r!.v, r: _.r!.r } }
33+
// case _.c === B && _.r?.c === R && _.r.r?.c === R:
34+
// return { c: R, l: { c: B, l: _.l, v: _.v, r: _.r!.l }, v: _.r!.v, r: { c: B, l: _.r!.r!.l, v: _.r!.r!.v, r: _.r!.r!.r } }
35+
// case _.c === BB && _.r?.c === R && _.r.l?.c === R:
36+
// return { c: B, l: { c: B, l: _.l, v: _.v, r: _.r!.l!.l }, v: _.r!.l!.v, r: { c: B, l: _.r!.l!.r, v: _.r!.v, r: _.r!.r } }
37+
// case _.c === BB && _.l?.c === R && _.l.r?.c === R:
38+
// return { c: B, l: { c: B, l: _.l!.l, v: _.l!.v, r: _.l!.r!.l }, v: _.l!.r!.v, r: { c: B, l: _.l!.r!.r, v: _.v, r: _.r } }
39+
// default:
40+
// return _
41+
// }
42+
// }
4343

44-
export default balance
44+
// export default balance

insert.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { R, E, EE, N, mk } from './prelude.js'
22
import * as Cmp from '@prelude/cmp'
3-
import balance from './balance-inlined.js'
3+
import balance from './balance.js'
44

55
const insert =
66
<T, K>(_: N<T>, key: (value: T) => K, cmp: Cmp.t<K>, x: T, merge: (a: T, b: T) => T): NonNullable<N<T>> => {

prelude.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@ export type P = typeof R | typeof B | typeof BB
66

77
export const E = undefined
88
export const EE = null
9-
export type N<T> = typeof E | typeof EE | { c: 1 | 2 | 3, l: N<T>, v: T, r: N<T> }
9+
export type N<T> = typeof E | typeof EE | {
10+
c: 1 | 2 | 3,
11+
l: N<T>,
12+
v: T,
13+
r: N<T>,
14+
n: number
15+
}
16+
1017
export type M<T> = NonNullable<N<T>>
1118

1219
export const mk =
1320
<T>(c: P, l: N<T>, v: T, r: N<T>): M<T> => ({
14-
c, l, v, r
21+
c, l, v, r, n: 1 + (l?.n ?? 0) + (r?.n ?? 0)
1522
})

rb-tree.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ export const each =
108108
<T, K>(tree: RbTree<T, K>): Generator<T> =>
109109
each_(tree.root)
110110

111+
export const count =
112+
<T, K>(tree: RbTree<T, K>): number =>
113+
tree.root?.n ?? 0
114+
111115
const linearCount_ =
112116
<T>(_: N<T>): number =>
113117
_ ? 1 + linearCount_(_.l) + linearCount_(_.r) : 0

rotate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { R, B, BB, E, EE, M, mk } from './prelude.js'
2-
import balance from './balance-inlined.js'
2+
import balance from './balance.js'
33

44
const rotate =
55
<T>(_: M<T>): M<T> => {

test/rbtree.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,16 @@ test('random numbers', () => {
3838

3939
describe('pop', () => {
4040

41-
const n = 1_000_000
41+
const n = 1_000
4242
const rb = RbTree.of(RbTree.Cmp.numbers, (_: number) => _)
4343
const xs: number[] = []
4444

4545
test(`insert ${n}`, () => {
4646
for (let i = 0; i < n; i++) {
4747
RbTree.insert(rb, Math.random())
48+
if (rb.root?.n !== i + 1) {
49+
throw new Error(`${rb.root?.n} != ${i + 1}`)
50+
}
4851
}
4952
})
5053

@@ -83,13 +86,16 @@ describe('deletes', () => {
8386

8487
test('deletions', () => {
8588
expect(RbTree.linearCount(rb)).toBe(n)
89+
expect(RbTree.count(rb)).toBe(n)
8690
for (let i = 0; i < n; i++) {
8791
const value = Arrays.deleteSwapRandom(xs)
8892
expect(RbTree.has(rb, value)).toBe(true)
8993
RbTree.delete(rb, value)
9094
expect(RbTree.has(rb, value)).toBe(false)
95+
expect(RbTree.count(rb)).toBe(n - (i + 1))
9196
}
9297
expect(RbTree.linearCount(rb)).toBe(0)
98+
expect(RbTree.count(rb)).toBe(0)
9399
})
94100

95101
})

0 commit comments

Comments
 (0)