@opensumi/ide-utils 3.2.6-next-1725007925.0 → 3.2.6-next-1725270864.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/heap.d.ts +31 -0
- package/lib/heap.d.ts.map +1 -0
- package/lib/heap.js +73 -0
- package/lib/heap.js.map +1 -0
- package/lib/index.d.ts +6 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -5
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
- package/src/heap.ts +106 -0
- package/src/index.ts +7 -5
package/lib/heap.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 大小堆(优先队列)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* return a negative value if a < b, 0 if a == b, a positive value if a > b
|
|
6
|
+
*/
|
|
7
|
+
export type Comparator<K> = (a: K, b: K) => number;
|
|
8
|
+
interface HeapOptions<T> {
|
|
9
|
+
/**
|
|
10
|
+
* A function that defines the sort order. The return value should be a number whose sign
|
|
11
|
+
* indicates the relative order of the two elements: negative if a is less than b,
|
|
12
|
+
* positive if a is greater than b, and zero if they are equal.
|
|
13
|
+
* NaN is treated as 0.
|
|
14
|
+
*/
|
|
15
|
+
comparator: Comparator<T>;
|
|
16
|
+
}
|
|
17
|
+
export declare class Heap<T> {
|
|
18
|
+
private readonly elements;
|
|
19
|
+
size: number;
|
|
20
|
+
private cmp;
|
|
21
|
+
constructor(options: HeapOptions<T>);
|
|
22
|
+
peek(): T;
|
|
23
|
+
pop(): T | undefined;
|
|
24
|
+
add(data: T): void;
|
|
25
|
+
toArray(): Array<T>;
|
|
26
|
+
private _float;
|
|
27
|
+
private _sink;
|
|
28
|
+
private swap;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=heap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heap.d.ts","sourceRoot":"","sources":["../src/heap.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;AAEnD,UAAU,WAAW,CAAC,CAAC;IACrB;;;;;OAKG;IACH,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED,qBAAa,IAAI,CAAC,CAAC;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAGzC,IAAI,EAAE,MAAM,CAAK;IAEjB,OAAO,CAAC,GAAG,CAAgB;gBAEf,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAInC,IAAI,IAAI,CAAC;IAIT,GAAG,IAAI,CAAC,GAAG,SAAS;IAmBpB,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAOlB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;IAInB,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,IAAI;CAKb"}
|
package/lib/heap.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 大小堆(优先队列)
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Heap = void 0;
|
|
7
|
+
class Heap {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.elements = [];
|
|
10
|
+
// 堆元素数量
|
|
11
|
+
this.size = 0;
|
|
12
|
+
this.cmp = options.comparator;
|
|
13
|
+
}
|
|
14
|
+
peek() {
|
|
15
|
+
return this.elements[0];
|
|
16
|
+
}
|
|
17
|
+
pop() {
|
|
18
|
+
if (this.elements.length === 0) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
if (this.elements.length === 1) {
|
|
22
|
+
this.size--;
|
|
23
|
+
return this.elements.pop();
|
|
24
|
+
}
|
|
25
|
+
const res = this.elements[0];
|
|
26
|
+
this.elements[0] = this.elements.pop();
|
|
27
|
+
this.size--;
|
|
28
|
+
// 维护最大堆的特性:下沉操作
|
|
29
|
+
this._sink(0);
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
32
|
+
add(data) {
|
|
33
|
+
this.elements.push(data);
|
|
34
|
+
this.size++;
|
|
35
|
+
this._float();
|
|
36
|
+
}
|
|
37
|
+
toArray() {
|
|
38
|
+
return this.elements.slice(0, this.size);
|
|
39
|
+
}
|
|
40
|
+
_float() {
|
|
41
|
+
let idx = this.size - 1;
|
|
42
|
+
let p;
|
|
43
|
+
while (idx > 0) {
|
|
44
|
+
// 获取父节点索引
|
|
45
|
+
p = (idx - 1) >> 1;
|
|
46
|
+
if (this.cmp(this.elements[p], this.elements[idx]) <= 0) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
this.swap(p, idx);
|
|
50
|
+
idx = p;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
_sink(start) {
|
|
54
|
+
const halfLength = this.size >> 1;
|
|
55
|
+
while (start < halfLength) {
|
|
56
|
+
const l = (start << 1) | 1;
|
|
57
|
+
const r = l + 1;
|
|
58
|
+
const minIdx = r < this.size && this.cmp(this.elements[r], this.elements[l]) < 0 ? r : l;
|
|
59
|
+
if (this.cmp(this.elements[minIdx], this.elements[start]) >= 0) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
this.swap(start, minIdx);
|
|
63
|
+
start = minIdx;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
swap(i, j) {
|
|
67
|
+
const tmp = this.elements[i];
|
|
68
|
+
this.elements[i] = this.elements[j];
|
|
69
|
+
this.elements[j] = tmp;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.Heap = Heap;
|
|
73
|
+
//# sourceMappingURL=heap.js.map
|
package/lib/heap.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heap.js","sourceRoot":"","sources":["../src/heap.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiBH,MAAa,IAAI;IAQf,YAAY,OAAuB;QAPlB,aAAQ,GAAa,EAAE,CAAC;QAEzC,QAAQ;QACR,SAAI,GAAW,CAAC,CAAC;QAKf,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;SAC5B;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAG,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEd,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,IAAO;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,MAAM;QACZ,IAAI,GAAG,GAAW,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAS,CAAC;QACd,OAAO,GAAG,GAAG,CAAC,EAAE;YACd,UAAU;YACV,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAEnB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;gBACvD,MAAM;aACP;YAED,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAClB,GAAG,GAAG,CAAC,CAAC;SACT;IACH,CAAC;IAEO,KAAK,CAAC,KAAa;QACzB,MAAM,UAAU,GAAW,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAE1C,OAAO,KAAK,GAAG,UAAU,EAAE;YACzB,MAAM,CAAC,GAAW,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,GAAW,CAAC,GAAG,CAAC,CAAC;YAExB,MAAM,MAAM,GAAW,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;gBAC9D,MAAM;aACP;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACzB,KAAK,GAAG,MAAM,CAAC;SAChB;IACH,CAAC;IAEO,IAAI,CAAC,CAAS,EAAE,CAAS;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzB,CAAC;CACF;AAtFD,oBAsFC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export * as process from './process';
|
|
2
|
+
export * as strings from './strings';
|
|
3
|
+
export * as arrays from './arrays';
|
|
4
|
+
export * as objects from './objects';
|
|
5
|
+
export * as path from './path';
|
|
1
6
|
export * from './ansi';
|
|
2
7
|
export * from './async';
|
|
3
8
|
export * from './buffer';
|
|
@@ -33,9 +38,5 @@ export * from './uint';
|
|
|
33
38
|
export * from './uri';
|
|
34
39
|
export * from './uuid';
|
|
35
40
|
export * from './const';
|
|
36
|
-
export *
|
|
37
|
-
export * as strings from './strings';
|
|
38
|
-
export * as arrays from './arrays';
|
|
39
|
-
export * as objects from './objects';
|
|
40
|
-
export * as path from './path';
|
|
41
|
+
export * from './heap';
|
|
41
42
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.path = exports.objects = exports.arrays = exports.strings = exports.process = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
exports.process = tslib_1.__importStar(require("./process"));
|
|
6
|
+
exports.strings = tslib_1.__importStar(require("./strings"));
|
|
7
|
+
exports.arrays = tslib_1.__importStar(require("./arrays"));
|
|
8
|
+
exports.objects = tslib_1.__importStar(require("./objects"));
|
|
9
|
+
exports.path = tslib_1.__importStar(require("./path"));
|
|
5
10
|
tslib_1.__exportStar(require("./ansi"), exports);
|
|
6
11
|
tslib_1.__exportStar(require("./async"), exports);
|
|
7
12
|
tslib_1.__exportStar(require("./buffer"), exports);
|
|
@@ -37,9 +42,5 @@ tslib_1.__exportStar(require("./uint"), exports);
|
|
|
37
42
|
tslib_1.__exportStar(require("./uri"), exports);
|
|
38
43
|
tslib_1.__exportStar(require("./uuid"), exports);
|
|
39
44
|
tslib_1.__exportStar(require("./const"), exports);
|
|
40
|
-
|
|
41
|
-
exports.strings = tslib_1.__importStar(require("./strings"));
|
|
42
|
-
exports.arrays = tslib_1.__importStar(require("./arrays"));
|
|
43
|
-
exports.objects = tslib_1.__importStar(require("./objects"));
|
|
44
|
-
exports.path = tslib_1.__importStar(require("./path"));
|
|
45
|
+
tslib_1.__exportStar(require("./heap"), exports);
|
|
45
46
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,iDAAuB;AACvB,kDAAwB;AACxB,mDAAyB;AACzB,kDAAwB;AACxB,yDAA+B;AAC/B,iEAAuC;AACvC,qDAA2B;AAC3B,iDAAuB;AACvB,uDAA6B;AAC7B,uDAA6B;AAC7B,qDAA2B;AAC3B,mDAAyB;AACzB,kDAAwB;AACxB,qDAA2B;AAC3B,oDAA0B;AAC1B,uDAA6B;AAC7B,iDAAuB;AACvB,iDAAuB;AACvB,qDAA2B;AAC3B,sDAA4B;AAC5B,oDAA0B;AAC1B,wDAA8B;AAC9B,wDAA8B;AAC9B,gDAAsB;AACtB,wDAA8B;AAC9B,+CAAqB;AACrB,qDAA2B;AAC3B,qDAA2B;AAC3B,qDAA2B;AAC3B,qDAA2B;AAC3B,kDAAwB;AACxB,iDAAuB;AACvB,gDAAsB;AACtB,iDAAuB;AACvB,kDAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,6DAAqC;AACrC,6DAAqC;AACrC,2DAAmC;AACnC,6DAAqC;AACrC,uDAA+B;AAE/B,iDAAuB;AACvB,kDAAwB;AACxB,mDAAyB;AACzB,kDAAwB;AACxB,yDAA+B;AAC/B,iEAAuC;AACvC,qDAA2B;AAC3B,iDAAuB;AACvB,uDAA6B;AAC7B,uDAA6B;AAC7B,qDAA2B;AAC3B,mDAAyB;AACzB,kDAAwB;AACxB,qDAA2B;AAC3B,oDAA0B;AAC1B,uDAA6B;AAC7B,iDAAuB;AACvB,iDAAuB;AACvB,qDAA2B;AAC3B,sDAA4B;AAC5B,oDAA0B;AAC1B,wDAA8B;AAC9B,wDAA8B;AAC9B,gDAAsB;AACtB,wDAA8B;AAC9B,+CAAqB;AACrB,qDAA2B;AAC3B,qDAA2B;AAC3B,qDAA2B;AAC3B,qDAA2B;AAC3B,kDAAwB;AACxB,iDAAuB;AACvB,gDAAsB;AACtB,iDAAuB;AACvB,kDAAwB;AACxB,iDAAuB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-utils",
|
|
3
|
-
"version": "3.2.6-next-
|
|
3
|
+
"version": "3.2.6-next-1725270864.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"lib",
|
|
6
6
|
"src"
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"vscode-uri": "3.0.2"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@opensumi/ide-dev-tool": "3.2.6-next-
|
|
26
|
+
"@opensumi/ide-dev-tool": "3.2.6-next-1725270864.0"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "822055085b8a4241bec312e5ff5af692301ef93f"
|
|
29
29
|
}
|
package/src/heap.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 大小堆(优先队列)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* return a negative value if a < b, 0 if a == b, a positive value if a > b
|
|
7
|
+
*/
|
|
8
|
+
export type Comparator<K> = (a: K, b: K) => number;
|
|
9
|
+
|
|
10
|
+
interface HeapOptions<T> {
|
|
11
|
+
/**
|
|
12
|
+
* A function that defines the sort order. The return value should be a number whose sign
|
|
13
|
+
* indicates the relative order of the two elements: negative if a is less than b,
|
|
14
|
+
* positive if a is greater than b, and zero if they are equal.
|
|
15
|
+
* NaN is treated as 0.
|
|
16
|
+
*/
|
|
17
|
+
comparator: Comparator<T>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class Heap<T> {
|
|
21
|
+
private readonly elements: Array<T> = [];
|
|
22
|
+
|
|
23
|
+
// 堆元素数量
|
|
24
|
+
size: number = 0;
|
|
25
|
+
|
|
26
|
+
private cmp: Comparator<T>;
|
|
27
|
+
|
|
28
|
+
constructor(options: HeapOptions<T>) {
|
|
29
|
+
this.cmp = options.comparator;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
peek(): T {
|
|
33
|
+
return this.elements[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pop(): T | undefined {
|
|
37
|
+
if (this.elements.length === 0) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (this.elements.length === 1) {
|
|
41
|
+
this.size--;
|
|
42
|
+
return this.elements.pop();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const res = this.elements[0];
|
|
46
|
+
this.elements[0] = this.elements.pop()!;
|
|
47
|
+
this.size--;
|
|
48
|
+
|
|
49
|
+
// 维护最大堆的特性:下沉操作
|
|
50
|
+
this._sink(0);
|
|
51
|
+
|
|
52
|
+
return res;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
add(data: T): void {
|
|
56
|
+
this.elements.push(data);
|
|
57
|
+
this.size++;
|
|
58
|
+
|
|
59
|
+
this._float();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
toArray(): Array<T> {
|
|
63
|
+
return this.elements.slice(0, this.size);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private _float(): void {
|
|
67
|
+
let idx: number = this.size - 1;
|
|
68
|
+
|
|
69
|
+
let p: number;
|
|
70
|
+
while (idx > 0) {
|
|
71
|
+
// 获取父节点索引
|
|
72
|
+
p = (idx - 1) >> 1;
|
|
73
|
+
|
|
74
|
+
if (this.cmp(this.elements[p], this.elements[idx]) <= 0) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
this.swap(p, idx);
|
|
79
|
+
idx = p;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private _sink(start: number): void {
|
|
84
|
+
const halfLength: number = this.size >> 1;
|
|
85
|
+
|
|
86
|
+
while (start < halfLength) {
|
|
87
|
+
const l: number = (start << 1) | 1;
|
|
88
|
+
const r: number = l + 1;
|
|
89
|
+
|
|
90
|
+
const minIdx: number = r < this.size && this.cmp(this.elements[r], this.elements[l]) < 0 ? r : l;
|
|
91
|
+
|
|
92
|
+
if (this.cmp(this.elements[minIdx], this.elements[start]) >= 0) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
this.swap(start, minIdx);
|
|
97
|
+
start = minIdx;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private swap(i: number, j: number): void {
|
|
102
|
+
const tmp = this.elements[i];
|
|
103
|
+
this.elements[i] = this.elements[j];
|
|
104
|
+
this.elements[j] = tmp;
|
|
105
|
+
}
|
|
106
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export * as process from './process';
|
|
2
|
+
export * as strings from './strings';
|
|
3
|
+
export * as arrays from './arrays';
|
|
4
|
+
export * as objects from './objects';
|
|
5
|
+
export * as path from './path';
|
|
6
|
+
|
|
1
7
|
export * from './ansi';
|
|
2
8
|
export * from './async';
|
|
3
9
|
export * from './buffer';
|
|
@@ -33,8 +39,4 @@ export * from './uint';
|
|
|
33
39
|
export * from './uri';
|
|
34
40
|
export * from './uuid';
|
|
35
41
|
export * from './const';
|
|
36
|
-
export *
|
|
37
|
-
export * as strings from './strings';
|
|
38
|
-
export * as arrays from './arrays';
|
|
39
|
-
export * as objects from './objects';
|
|
40
|
-
export * as path from './path';
|
|
42
|
+
export * from './heap';
|