Skip to content

Commit 4b548dc

Browse files
committed
测试
1 parent 84bf1a5 commit 4b548dc

File tree

3 files changed

+45
-36
lines changed

3 files changed

+45
-36
lines changed

finding-mk-average/MultiRedBlackNode.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

finding-mk-average/MultiRedBlackTree.ts

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,72 @@
11
import { Direction } from "https://deno.land/std@0.173.0/collections/binary_search_node.ts";
2+
import { RedBlackNode } from "https://deno.land/std@0.173.0/collections/red_black_node.ts";
23
import RedBlackTreeExtended from "../dinner-plate-stacks/RedBlackTree.ts";
3-
import { MultiRedBlackNode } from "./MultiRedBlackNode.ts";
4-
54

65
export class MultiRedBlackTree<T> extends RedBlackTreeExtended<T> {
7-
root: MultiRedBlackNode<T> | null = null;
8-
getRoot(): MultiRedBlackNode<T> | null {
6+
static node2count = new WeakMap<RedBlackNode<any>, number>();
7+
8+
static getCount(node: RedBlackNode<any>): number {
9+
return MultiRedBlackTree.node2count.get(node) ?? 1;
10+
}
11+
root: RedBlackNode<T> | null = null;
12+
getRoot(): RedBlackNode<T> | null {
913
return this.root;
1014
}
11-
findNode(value: T): MultiRedBlackNode<T> | null {
12-
return super.findNode(value) as MultiRedBlackNode<T> | null;
15+
findNode(value: T): RedBlackNode<T> | null {
16+
return super.findNode(value) as RedBlackNode<T> | null;
1317
}
1418
remove(value: T): boolean {
1519
const node = this.findNode(value);
1620

1721
if (!node) {
1822
return false;
1923
} else {
20-
node.count--;
21-
if (node.count <= 0) this.removeTreeNode(node);
24+
// node.count--;
25+
MultiRedBlackTree.node2count.set(
26+
node,
27+
(MultiRedBlackTree.node2count.get(node) ?? 1) - 1,
28+
);
29+
console.log("decrement", node);
30+
// console.trace();
31+
if ((MultiRedBlackTree.node2count.get(node) ?? 1) <= 0) {
32+
// if (node.count <= 0) {
33+
this.removeTreeNode(node);
34+
}
2235
return true;
2336
}
2437
}
2538
insert(value: T): boolean {
2639
const node = this.findNode(value);
2740

2841
if (node) {
29-
node.count++;
42+
// node.count++;
43+
MultiRedBlackTree.node2count.set(
44+
node,
45+
(MultiRedBlackTree.node2count.get(node) ?? 1) + 1,
46+
);
47+
console.log("increment", node);
3048
return true;
3149
} else {
3250
this.insertGetNode(value);
3351
}
3452
return true;
3553
}
36-
insertGetNode(value: T): MultiRedBlackNode<T> | null {
54+
insertGetNode(value: T): RedBlackNode<T> | null {
3755
let node = this.insertNode(
38-
MultiRedBlackNode,
39-
value
40-
) as MultiRedBlackNode<T> | null;
56+
RedBlackNode,
57+
value,
58+
) as RedBlackNode<T> | null;
59+
if (node) MultiRedBlackTree.node2count.set(node, 1);
60+
4161
if (node) {
4262
while (node.parent?.red) {
43-
let parent: MultiRedBlackNode<T> = node.parent!;
44-
const parentDirection: Direction =
45-
parent.directionFromParent()!;
46-
const uncleDirection: Direction =
47-
parentDirection === "right" ? "left" : "right";
48-
const uncle: MultiRedBlackNode<T> | null =
63+
let parent: RedBlackNode<T> = node.parent!;
64+
const parentDirection: Direction = parent
65+
.directionFromParent()!;
66+
const uncleDirection: Direction = parentDirection === "right"
67+
? "left"
68+
: "right";
69+
const uncle: RedBlackNode<T> | null =
4970
parent.parent![uncleDirection] ?? null;
5071

5172
if (uncle?.red) {

finding-mk-average/index.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { reverseInOrderIterator } from "../dinner-plate-stacks/reverseInOrderIte
22
import { InOrderIterator } from "./InOrderIterator.ts";
33
import { MultiRedBlackTree } from "./MultiRedBlackTree.ts";
44

5-
65
class MKAverage {
76
total = 0;
87
m: number;
@@ -28,7 +27,7 @@ class MKAverage {
2827
{
2928
const temp: [number, number][] = [];
3029
for (const node of InOrderIterator(root)) {
31-
temp.push([node.value, node.count]);
30+
temp.push([node.value, MultiRedBlackTree.getCount(node)]);
3231
}
3332
console.log(JSON.stringify(temp));
3433
}
@@ -46,7 +45,7 @@ class MKAverage {
4645
{
4746
const temp: [number, number][] = [];
4847
for (const node of InOrderIterator(root)) {
49-
temp.push([node.value, node.count]);
48+
temp.push([node.value, MultiRedBlackTree.getCount(node)]);
5049
}
5150
console.log(JSON.stringify(temp));
5251
}
@@ -62,7 +61,7 @@ class MKAverage {
6261
{
6362
const temp: [number, number][] = [];
6463
for (const node of InOrderIterator(root)) {
65-
temp.push([node.value, node.count]);
64+
temp.push([node.value, MultiRedBlackTree.getCount(node)]);
6665
}
6766
console.log(JSON.stringify(temp));
6867
}
@@ -72,15 +71,15 @@ class MKAverage {
7271

7372
for (const node of InOrderIterator(root)) {
7473
// console.log(node)
75-
const min = Math.min(k, node.count);
74+
const min = Math.min(k, MultiRedBlackTree.getCount(node));
7675
ret -= node.value * min;
7776
k -= min;
7877
if (k === 0) break;
7978
}
8079
k = this.k;
8180
for (const node of reverseInOrderIterator(root)) {
8281
// debugger;
83-
const min = Math.min(k, node.count);
82+
const min = Math.min(k, MultiRedBlackTree.getCount(node));
8483
ret -= node.value * min;
8584
k -= min;
8685
if (k === 0) break;

0 commit comments

Comments
 (0)