@x-oasis/prefix-interval-tree 0.0.10

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/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @x-oasis/omit
2
+
3
+ ## Installation
4
+
5
+ ```bash
6
+ $ npm i @x-oasis/omit
7
+ ```
8
+
9
+ ## How to use
10
+
11
+ ```typescript
12
+ import omit from '@x-oasis/omit'
13
+ ```
@@ -0,0 +1,37 @@
1
+ declare class PrefixIntervalTree {
2
+ private _size;
3
+ private _half;
4
+ private _heap;
5
+ private _maxUsefulLength;
6
+ private _onUpdateItemLayout;
7
+ private _onUpdateIntervalTree;
8
+ constructor(xs: number[] | number, opts?: {
9
+ onUpdateItemLayout?: Function;
10
+ onUpdateIntervalTree?: Function;
11
+ });
12
+ initWithNumber(length: number): void;
13
+ initWithArray(arr: number[]): void;
14
+ static uniform(size: number, initialValue: number): PrefixIntervalTree;
15
+ static empty(size: number): PrefixIntervalTree;
16
+ stretch(): void;
17
+ remove(index: number): boolean;
18
+ set(index: number, value: number): void;
19
+ getMaxUsefulLength(): number;
20
+ get(index: number): number;
21
+ getSize(): number;
22
+ getHalf(): number;
23
+ getHeap(): number[];
24
+ getMaxValue(): number;
25
+ sumUntil(end: number): number;
26
+ sumTo(inclusiveEnd: number): number;
27
+ sum(begin: number, end: number): number;
28
+ greatestLowerBound(t: number): number;
29
+ greatestStrictLowerBound(t: number): number;
30
+ computeRange(minOffset: number, maxOffset: number): {
31
+ startIndex: number;
32
+ endIndex: number;
33
+ };
34
+ leastUpperBound(t: number): number;
35
+ leastStrictUpperBound(t: number): number;
36
+ }
37
+ export default PrefixIntervalTree;
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+
2
+ 'use strict'
3
+
4
+ if (process.env.NODE_ENV === 'production') {
5
+ module.exports = require('./prefix-interval-tree.cjs.production.min.js')
6
+ } else {
7
+ module.exports = require('./prefix-interval-tree.cjs.development.js')
8
+ }
@@ -0,0 +1,217 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var parent = function parent(node) {
6
+ return Math.floor(node / 2);
7
+ };
8
+ var createArray = function createArray(size) {
9
+ var xs = [];
10
+ for (var i = size - 1; i >= 0; --i) {
11
+ xs[i] = 0;
12
+ }
13
+ return xs;
14
+ };
15
+ function ceilLog2(x) {
16
+ var y = 1;
17
+ while (y < x) {
18
+ y *= 2;
19
+ }
20
+ return y;
21
+ }
22
+ var PrefixIntervalTree = /*#__PURE__*/function () {
23
+ function PrefixIntervalTree(xs, opts) {
24
+ if (typeof xs === 'number') this.initWithNumber(xs);
25
+ if (Array.isArray(xs)) this.initWithArray(xs);
26
+ var _ref = opts || {},
27
+ onUpdateItemLayout = _ref.onUpdateItemLayout,
28
+ onUpdateIntervalTree = _ref.onUpdateIntervalTree;
29
+ this._onUpdateIntervalTree = onUpdateIntervalTree;
30
+ this._onUpdateItemLayout = onUpdateItemLayout;
31
+ }
32
+ var _proto = PrefixIntervalTree.prototype;
33
+ _proto.initWithNumber = function initWithNumber(length) {
34
+ this._half = ceilLog2(length);
35
+ this._size = this._half;
36
+ this._heap = createArray(2 * this._half);
37
+ this._maxUsefulLength = 0;
38
+ };
39
+ _proto.initWithArray = function initWithArray(arr) {
40
+ this._half = ceilLog2(arr.length);
41
+ this._size = this._half;
42
+ this._heap = createArray(2 * this._half);
43
+ var i;
44
+ for (i = 0; i < this._size; ++i) {
45
+ this._heap[this._half + i] = arr[i];
46
+ }
47
+ for (i = this._half - 1; i > 0; --i) {
48
+ this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];
49
+ }
50
+ };
51
+ PrefixIntervalTree.uniform = function uniform(size, initialValue) {
52
+ var xs = [];
53
+ for (var i = size - 1; i >= 0; --i) {
54
+ xs[i] = initialValue;
55
+ }
56
+ return new PrefixIntervalTree(xs);
57
+ };
58
+ PrefixIntervalTree.empty = function empty(size) {
59
+ return PrefixIntervalTree.uniform(size, 0);
60
+ };
61
+ _proto.stretch = function stretch() {
62
+ var nextHeap = createArray(2 * this._half * 2);
63
+ var nextHeapHalf = this._half * 2;
64
+ for (var i = 0; i < this._size; i++) {
65
+ nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;
66
+ }
67
+ for (var _i = nextHeapHalf - 1; _i > 0; _i--) {
68
+ nextHeap[_i] = nextHeap[2 * _i] + nextHeap[2 * _i + 1];
69
+ }
70
+ this._half = nextHeapHalf;
71
+ this._size = nextHeapHalf;
72
+ this._heap = nextHeap;
73
+ };
74
+ _proto.remove = function remove(index) {
75
+ if (index > this._size) return false;
76
+ var nextHeap = createArray(this._half * 2);
77
+ for (var i = 0; i < this._size; i++) {
78
+ var step = 0;
79
+ if (index === i) {
80
+ step = 1;
81
+ continue;
82
+ }
83
+ nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;
84
+ }
85
+ for (var _i2 = this._half - 1; _i2 > 0; _i2--) {
86
+ nextHeap[_i2] = nextHeap[2 * _i2] + nextHeap[2 * _i2 + 1];
87
+ }
88
+ this._heap = nextHeap;
89
+ this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);
90
+ return true;
91
+ };
92
+ _proto.set = function set(index, value) {
93
+ if (typeof index !== 'number') return;
94
+ if (isNaN(index)) {
95
+ console.warn('Passing a NaN value as interval tree index');
96
+ return;
97
+ }
98
+ while (index >= this._half) {
99
+ this.stretch();
100
+ }
101
+ var node = this._half + index;
102
+ this._heap[node] = value;
103
+ node = parent(node);
104
+ for (; node !== 0; node = parent(node)) {
105
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
106
+ }
107
+ if (index + 1 > this._maxUsefulLength) {
108
+ this._maxUsefulLength = index + 1;
109
+ }
110
+ if (typeof this._onUpdateIntervalTree === 'function') {
111
+ this._onUpdateIntervalTree(this._heap);
112
+ }
113
+ if (typeof this._onUpdateItemLayout === 'function') {
114
+ this._onUpdateItemLayout(index, value);
115
+ }
116
+ };
117
+ _proto.getMaxUsefulLength = function getMaxUsefulLength() {
118
+ return this._maxUsefulLength;
119
+ };
120
+ _proto.get = function get(index) {
121
+ var node = this._half + index;
122
+ return this._heap[node];
123
+ };
124
+ _proto.getSize = function getSize() {
125
+ return this._size;
126
+ };
127
+ _proto.getHalf = function getHalf() {
128
+ return this._half;
129
+ };
130
+ _proto.getHeap = function getHeap() {
131
+ return this._heap;
132
+ };
133
+ _proto.getMaxValue = function getMaxValue() {
134
+ return this._heap[1];
135
+ };
136
+ _proto.sumUntil = function sumUntil(end) {
137
+ if (end === 0) {
138
+ return 0;
139
+ }
140
+ var node = this._half + end - 1;
141
+ var sum = this._heap[node];
142
+ for (; node !== 1; node = parent(node)) {
143
+ if (node % 2 === 1) {
144
+ sum += this._heap[node - 1];
145
+ }
146
+ }
147
+ return sum;
148
+ };
149
+ _proto.sumTo = function sumTo(inclusiveEnd) {
150
+ return this.sumUntil(inclusiveEnd + 1);
151
+ };
152
+ _proto.sum = function sum(begin, end) {
153
+ return this.sumUntil(end) - this.sumUntil(begin);
154
+ };
155
+ _proto.greatestLowerBound = function greatestLowerBound(t) {
156
+ if (t < 0) {
157
+ return -1;
158
+ }
159
+ var node = 1;
160
+ if (this._heap[node] < t) {
161
+ return Math.max(this._maxUsefulLength - 1, 0);
162
+ }
163
+ while (node < this._half) {
164
+ var leftSum = this._heap[2 * node];
165
+ if (t < leftSum) {
166
+ node = 2 * node;
167
+ } else {
168
+ node = 2 * node + 1;
169
+ t -= leftSum;
170
+ }
171
+ }
172
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
173
+ };
174
+ _proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
175
+ if (t <= 0) {
176
+ return -1;
177
+ }
178
+ var node = 1;
179
+ if (this._heap[node] < t) {
180
+ return Math.max(this._maxUsefulLength - 1, 0);
181
+ }
182
+ while (node < this._half) {
183
+ var leftSum = this._heap[2 * node];
184
+ if (t <= leftSum) {
185
+ node = 2 * node;
186
+ } else {
187
+ node = 2 * node + 1;
188
+ t -= leftSum;
189
+ }
190
+ }
191
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
192
+ };
193
+ _proto.computeRange = function computeRange(minOffset, maxOffset) {
194
+ if (this.getHeap()[1] < minOffset) {
195
+ return {
196
+ startIndex: this._maxUsefulLength - 1,
197
+ endIndex: this._maxUsefulLength - 1
198
+ };
199
+ }
200
+ var startIndex = this.leastStrictUpperBound(minOffset);
201
+ var endIndex = Math.min(this.greatestStrictLowerBound(maxOffset), Math.max(this._maxUsefulLength - 1, 0));
202
+ return {
203
+ startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,
204
+ endIndex: endIndex
205
+ };
206
+ };
207
+ _proto.leastUpperBound = function leastUpperBound(t) {
208
+ return this.greatestLowerBound(t) + 1;
209
+ };
210
+ _proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
211
+ return this.greatestStrictLowerBound(t);
212
+ };
213
+ return PrefixIntervalTree;
214
+ }();
215
+
216
+ exports.default = PrefixIntervalTree;
217
+ //# sourceMappingURL=prefix-interval-tree.cjs.development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix-interval-tree.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["// import invariant from 'invariant';\n\nconst parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _maxUsefulLength: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._maxUsefulLength = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n // this._maxUsefulLength = arr.length;\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n remove(index: number) {\n if (index > this._size) return false;\n const nextHeap = createArray(this._half * 2);\n\n for (let i = 0; i < this._size; i++) {\n let step = 0;\n if (index === i) {\n step = 1;\n continue;\n }\n nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;\n }\n\n for (let i = this._half - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._heap = nextHeap;\n\n this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);\n\n return true;\n }\n\n set(index: number, value: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number') return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._maxUsefulLength) {\n this._maxUsefulLength = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n }\n\n getMaxUsefulLength() {\n return this._maxUsefulLength;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end === 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) <= t, or\n * -1 if no such i exists.\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n // 这种写法的结果就是,如果中间一个item的length为0的话,那么它会一直往右边查;\n // 比如初始化的时候是[0, 0, 0, 0, 0, 0, 0, 0];\n // 你会发现node最后会是7,this._half为4;最终即使data没有数据,那么它的index算出来的也是\n // 7 - 4 = 3;所以,考虑到会存在一些item length为0的情况,所以,这个其实是比较合理的方式,\n // 拿右边的\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) < t, or\n * -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._maxUsefulLength - 1,\n endIndex: this._maxUsefulLength - 1,\n };\n }\n const startIndex = this.leastStrictUpperBound(minOffset);\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.greatestStrictLowerBound(maxOffset),\n Math.max(this._maxUsefulLength - 1, 0)\n );\n\n return {\n startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,\n endIndex,\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t < sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestStrictLowerBound(t);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_maxUsefulLength","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","remove","index","step","max","set","value","isNaN","console","warn","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=function(t){return Math.floor(t/2)},e=function(t){for(var e=[],h=t-1;h>=0;--h)e[h]=0;return e};function h(t){for(var e=1;e<t;)e*=2;return e}exports.default=function(){function i(t,e){"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var h=e||{},i=h.onUpdateItemLayout;this._onUpdateIntervalTree=h.onUpdateIntervalTree,this._onUpdateItemLayout=i}var n=i.prototype;return n.initWithNumber=function(t){this._half=h(t),this._size=this._half,this._heap=e(2*this._half),this._maxUsefulLength=0},n.initWithArray=function(t){var i;for(this._half=h(t.length),this._size=this._half,this._heap=e(2*this._half),i=0;i<this._size;++i)this._heap[this._half+i]=t[i];for(i=this._half-1;i>0;--i)this._heap[i]=this._heap[2*i]+this._heap[2*i+1]},i.uniform=function(t,e){for(var h=[],n=t-1;n>=0;--n)h[n]=e;return new i(h)},i.empty=function(t){return i.uniform(t,0)},n.stretch=function(){for(var t=e(2*this._half*2),h=2*this._half,i=0;i<this._size;i++)t[h+i]=this._heap[this._half+i]||0;for(var n=h-1;n>0;n--)t[n]=t[2*n]+t[2*n+1];this._half=h,this._size=h,this._heap=t},n.remove=function(t){if(t>this._size)return!1;for(var h=e(2*this._half),i=0;i<this._size;i++){var n=0;t!==i?h[this._half+i-n]=this._heap[this._half+i]||0:n=1}for(var r=this._half-1;r>0;r--)h[r]=h[2*r]+h[2*r+1];return this._heap=h,this._maxUsefulLength=Math.max(0,this._maxUsefulLength-1),!0},n.set=function(e,h){if("number"==typeof e)if(isNaN(e))console.warn("Passing a NaN value as interval tree index");else{for(;e>=this._half;)this.stretch();var i=this._half+e;for(this._heap[i]=h,i=t(i);0!==i;i=t(i))this._heap[i]=this._heap[2*i]+this._heap[2*i+1];e+1>this._maxUsefulLength&&(this._maxUsefulLength=e+1),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout&&this._onUpdateItemLayout(e,h)}},n.getMaxUsefulLength=function(){return this._maxUsefulLength},n.get=function(t){return this._heap[this._half+t]},n.getSize=function(){return this._size},n.getHalf=function(){return this._half},n.getHeap=function(){return this._heap},n.getMaxValue=function(){return this._heap[1]},n.sumUntil=function(e){if(0===e)return 0;for(var h=this._half+e-1,i=this._heap[h];1!==h;h=t(h))h%2==1&&(i+=this._heap[h-1]);return i},n.sumTo=function(t){return this.sumUntil(t+1)},n.sum=function(t,e){return this.sumUntil(e)-this.sumUntil(t)},n.greatestLowerBound=function(t){if(t<0)return-1;var e=1;if(this._heap[e]<t)return Math.max(this._maxUsefulLength-1,0);for(;e<this._half;){var h=this._heap[2*e];t<h?e*=2:(e=2*e+1,t-=h)}return Math.min(e-this._half,this._maxUsefulLength-1)},n.greatestStrictLowerBound=function(t){if(t<=0)return-1;var e=1;if(this._heap[e]<t)return Math.max(this._maxUsefulLength-1,0);for(;e<this._half;){var h=this._heap[2*e];t<=h?e*=2:(e=2*e+1,t-=h)}return Math.min(e-this._half,this._maxUsefulLength-1)},n.computeRange=function(t,e){if(this.getHeap()[1]<t)return{startIndex:this._maxUsefulLength-1,endIndex:this._maxUsefulLength-1};var h=this.leastStrictUpperBound(t),i=Math.min(this.greatestStrictLowerBound(e),Math.max(this._maxUsefulLength-1,0));return{startIndex:i>=0?Math.max(h,0):-1,endIndex:i}},n.leastUpperBound=function(t){return this.greatestLowerBound(t)+1},n.leastStrictUpperBound=function(t){return this.greatestStrictLowerBound(t)},i}();
2
+ //# sourceMappingURL=prefix-interval-tree.cjs.production.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix-interval-tree.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["// import invariant from 'invariant';\n\nconst parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _maxUsefulLength: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._maxUsefulLength = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n // this._maxUsefulLength = arr.length;\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n remove(index: number) {\n if (index > this._size) return false;\n const nextHeap = createArray(this._half * 2);\n\n for (let i = 0; i < this._size; i++) {\n let step = 0;\n if (index === i) {\n step = 1;\n continue;\n }\n nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;\n }\n\n for (let i = this._half - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._heap = nextHeap;\n\n this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);\n\n return true;\n }\n\n set(index: number, value: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number') return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._maxUsefulLength) {\n this._maxUsefulLength = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n }\n\n getMaxUsefulLength() {\n return this._maxUsefulLength;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end === 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) <= t, or\n * -1 if no such i exists.\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n // 这种写法的结果就是,如果中间一个item的length为0的话,那么它会一直往右边查;\n // 比如初始化的时候是[0, 0, 0, 0, 0, 0, 0, 0];\n // 你会发现node最后会是7,this._half为4;最终即使data没有数据,那么它的index算出来的也是\n // 7 - 4 = 3;所以,考虑到会存在一些item length为0的情况,所以,这个其实是比较合理的方式,\n // 拿右边的\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) < t, or\n * -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._maxUsefulLength - 1,\n endIndex: this._maxUsefulLength - 1,\n };\n }\n const startIndex = this.leastStrictUpperBound(minOffset);\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.greatestStrictLowerBound(maxOffset),\n Math.max(this._maxUsefulLength - 1, 0)\n );\n\n return {\n startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,\n endIndex,\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t < sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestStrictLowerBound(t);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","this","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","_onUpdateIntervalTree","onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_maxUsefulLength","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","remove","index","step","max","set","value","isNaN","console","warn","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ var parent = function parent(node) {
2
+ return Math.floor(node / 2);
3
+ };
4
+ var createArray = function createArray(size) {
5
+ var xs = [];
6
+ for (var i = size - 1; i >= 0; --i) {
7
+ xs[i] = 0;
8
+ }
9
+ return xs;
10
+ };
11
+ function ceilLog2(x) {
12
+ var y = 1;
13
+ while (y < x) {
14
+ y *= 2;
15
+ }
16
+ return y;
17
+ }
18
+ var PrefixIntervalTree = /*#__PURE__*/function () {
19
+ function PrefixIntervalTree(xs, opts) {
20
+ if (typeof xs === 'number') this.initWithNumber(xs);
21
+ if (Array.isArray(xs)) this.initWithArray(xs);
22
+ var _ref = opts || {},
23
+ onUpdateItemLayout = _ref.onUpdateItemLayout,
24
+ onUpdateIntervalTree = _ref.onUpdateIntervalTree;
25
+ this._onUpdateIntervalTree = onUpdateIntervalTree;
26
+ this._onUpdateItemLayout = onUpdateItemLayout;
27
+ }
28
+ var _proto = PrefixIntervalTree.prototype;
29
+ _proto.initWithNumber = function initWithNumber(length) {
30
+ this._half = ceilLog2(length);
31
+ this._size = this._half;
32
+ this._heap = createArray(2 * this._half);
33
+ this._maxUsefulLength = 0;
34
+ };
35
+ _proto.initWithArray = function initWithArray(arr) {
36
+ this._half = ceilLog2(arr.length);
37
+ this._size = this._half;
38
+ this._heap = createArray(2 * this._half);
39
+ var i;
40
+ for (i = 0; i < this._size; ++i) {
41
+ this._heap[this._half + i] = arr[i];
42
+ }
43
+ for (i = this._half - 1; i > 0; --i) {
44
+ this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];
45
+ }
46
+ };
47
+ PrefixIntervalTree.uniform = function uniform(size, initialValue) {
48
+ var xs = [];
49
+ for (var i = size - 1; i >= 0; --i) {
50
+ xs[i] = initialValue;
51
+ }
52
+ return new PrefixIntervalTree(xs);
53
+ };
54
+ PrefixIntervalTree.empty = function empty(size) {
55
+ return PrefixIntervalTree.uniform(size, 0);
56
+ };
57
+ _proto.stretch = function stretch() {
58
+ var nextHeap = createArray(2 * this._half * 2);
59
+ var nextHeapHalf = this._half * 2;
60
+ for (var i = 0; i < this._size; i++) {
61
+ nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;
62
+ }
63
+ for (var _i = nextHeapHalf - 1; _i > 0; _i--) {
64
+ nextHeap[_i] = nextHeap[2 * _i] + nextHeap[2 * _i + 1];
65
+ }
66
+ this._half = nextHeapHalf;
67
+ this._size = nextHeapHalf;
68
+ this._heap = nextHeap;
69
+ };
70
+ _proto.remove = function remove(index) {
71
+ if (index > this._size) return false;
72
+ var nextHeap = createArray(this._half * 2);
73
+ for (var i = 0; i < this._size; i++) {
74
+ var step = 0;
75
+ if (index === i) {
76
+ step = 1;
77
+ continue;
78
+ }
79
+ nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;
80
+ }
81
+ for (var _i2 = this._half - 1; _i2 > 0; _i2--) {
82
+ nextHeap[_i2] = nextHeap[2 * _i2] + nextHeap[2 * _i2 + 1];
83
+ }
84
+ this._heap = nextHeap;
85
+ this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);
86
+ return true;
87
+ };
88
+ _proto.set = function set(index, value) {
89
+ if (typeof index !== 'number') return;
90
+ if (isNaN(index)) {
91
+ console.warn('Passing a NaN value as interval tree index');
92
+ return;
93
+ }
94
+ while (index >= this._half) {
95
+ this.stretch();
96
+ }
97
+ var node = this._half + index;
98
+ this._heap[node] = value;
99
+ node = parent(node);
100
+ for (; node !== 0; node = parent(node)) {
101
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
102
+ }
103
+ if (index + 1 > this._maxUsefulLength) {
104
+ this._maxUsefulLength = index + 1;
105
+ }
106
+ if (typeof this._onUpdateIntervalTree === 'function') {
107
+ this._onUpdateIntervalTree(this._heap);
108
+ }
109
+ if (typeof this._onUpdateItemLayout === 'function') {
110
+ this._onUpdateItemLayout(index, value);
111
+ }
112
+ };
113
+ _proto.getMaxUsefulLength = function getMaxUsefulLength() {
114
+ return this._maxUsefulLength;
115
+ };
116
+ _proto.get = function get(index) {
117
+ var node = this._half + index;
118
+ return this._heap[node];
119
+ };
120
+ _proto.getSize = function getSize() {
121
+ return this._size;
122
+ };
123
+ _proto.getHalf = function getHalf() {
124
+ return this._half;
125
+ };
126
+ _proto.getHeap = function getHeap() {
127
+ return this._heap;
128
+ };
129
+ _proto.getMaxValue = function getMaxValue() {
130
+ return this._heap[1];
131
+ };
132
+ _proto.sumUntil = function sumUntil(end) {
133
+ if (end === 0) {
134
+ return 0;
135
+ }
136
+ var node = this._half + end - 1;
137
+ var sum = this._heap[node];
138
+ for (; node !== 1; node = parent(node)) {
139
+ if (node % 2 === 1) {
140
+ sum += this._heap[node - 1];
141
+ }
142
+ }
143
+ return sum;
144
+ };
145
+ _proto.sumTo = function sumTo(inclusiveEnd) {
146
+ return this.sumUntil(inclusiveEnd + 1);
147
+ };
148
+ _proto.sum = function sum(begin, end) {
149
+ return this.sumUntil(end) - this.sumUntil(begin);
150
+ };
151
+ _proto.greatestLowerBound = function greatestLowerBound(t) {
152
+ if (t < 0) {
153
+ return -1;
154
+ }
155
+ var node = 1;
156
+ if (this._heap[node] < t) {
157
+ return Math.max(this._maxUsefulLength - 1, 0);
158
+ }
159
+ while (node < this._half) {
160
+ var leftSum = this._heap[2 * node];
161
+ if (t < leftSum) {
162
+ node = 2 * node;
163
+ } else {
164
+ node = 2 * node + 1;
165
+ t -= leftSum;
166
+ }
167
+ }
168
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
169
+ };
170
+ _proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
171
+ if (t <= 0) {
172
+ return -1;
173
+ }
174
+ var node = 1;
175
+ if (this._heap[node] < t) {
176
+ return Math.max(this._maxUsefulLength - 1, 0);
177
+ }
178
+ while (node < this._half) {
179
+ var leftSum = this._heap[2 * node];
180
+ if (t <= leftSum) {
181
+ node = 2 * node;
182
+ } else {
183
+ node = 2 * node + 1;
184
+ t -= leftSum;
185
+ }
186
+ }
187
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
188
+ };
189
+ _proto.computeRange = function computeRange(minOffset, maxOffset) {
190
+ if (this.getHeap()[1] < minOffset) {
191
+ return {
192
+ startIndex: this._maxUsefulLength - 1,
193
+ endIndex: this._maxUsefulLength - 1
194
+ };
195
+ }
196
+ var startIndex = this.leastStrictUpperBound(minOffset);
197
+ var endIndex = Math.min(this.greatestStrictLowerBound(maxOffset), Math.max(this._maxUsefulLength - 1, 0));
198
+ return {
199
+ startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,
200
+ endIndex: endIndex
201
+ };
202
+ };
203
+ _proto.leastUpperBound = function leastUpperBound(t) {
204
+ return this.greatestLowerBound(t) + 1;
205
+ };
206
+ _proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
207
+ return this.greatestStrictLowerBound(t);
208
+ };
209
+ return PrefixIntervalTree;
210
+ }();
211
+
212
+ export default PrefixIntervalTree;
213
+ //# sourceMappingURL=prefix-interval-tree.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix-interval-tree.esm.js","sources":["../src/index.ts"],"sourcesContent":["// import invariant from 'invariant';\n\nconst parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _maxUsefulLength: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._maxUsefulLength = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n // this._maxUsefulLength = arr.length;\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n remove(index: number) {\n if (index > this._size) return false;\n const nextHeap = createArray(this._half * 2);\n\n for (let i = 0; i < this._size; i++) {\n let step = 0;\n if (index === i) {\n step = 1;\n continue;\n }\n nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;\n }\n\n for (let i = this._half - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._heap = nextHeap;\n\n this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);\n\n return true;\n }\n\n set(index: number, value: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number') return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._maxUsefulLength) {\n this._maxUsefulLength = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n }\n\n getMaxUsefulLength() {\n return this._maxUsefulLength;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end === 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) <= t, or\n * -1 if no such i exists.\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n // 这种写法的结果就是,如果中间一个item的length为0的话,那么它会一直往右边查;\n // 比如初始化的时候是[0, 0, 0, 0, 0, 0, 0, 0];\n // 你会发现node最后会是7,this._half为4;最终即使data没有数据,那么它的index算出来的也是\n // 7 - 4 = 3;所以,考虑到会存在一些item length为0的情况,所以,这个其实是比较合理的方式,\n // 拿右边的\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and sumUntil(i) < t, or\n * -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._maxUsefulLength - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._maxUsefulLength - 1);\n }\n\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._maxUsefulLength - 1,\n endIndex: this._maxUsefulLength - 1,\n };\n }\n const startIndex = this.leastStrictUpperBound(minOffset);\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.greatestStrictLowerBound(maxOffset),\n Math.max(this._maxUsefulLength - 1, 0)\n );\n\n return {\n startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,\n endIndex,\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t < sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestStrictLowerBound(t);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_maxUsefulLength","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","remove","index","step","max","set","value","isNaN","console","warn","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@x-oasis/prefix-interval-tree",
3
+ "version": "0.0.10",
4
+ "description": "prefix interval tree function",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "module": "dist/prefix-interval-tree.esm.js",
8
+ "files": [
9
+ "dist",
10
+ "index.ts",
11
+ "src"
12
+ ],
13
+ "author": "",
14
+ "license": "ISC",
15
+ "devDependencies": {
16
+ "tsdx": "^0.14.1"
17
+ },
18
+ "scripts": {
19
+ "build": "tsdx build --tsconfig tsconfig.build.json",
20
+ "clean": "rimraf ./dist",
21
+ "test": "vitest",
22
+ "compile": "tsc -p tsconfig.build.json"
23
+ }
24
+ }
package/src/index.ts ADDED
@@ -0,0 +1,344 @@
1
+ // import invariant from 'invariant';
2
+
3
+ const parent = (node: number) => Math.floor(node / 2);
4
+
5
+ const createArray = function (size: number) {
6
+ const xs = [];
7
+ for (let i = size - 1; i >= 0; --i) {
8
+ xs[i] = 0;
9
+ }
10
+ return xs;
11
+ };
12
+
13
+ /**
14
+ * Computes the next power of 2 after or equal to x.
15
+ */
16
+ function ceilLog2(x: number) {
17
+ let y = 1;
18
+ while (y < x) {
19
+ y *= 2;
20
+ }
21
+
22
+ return y;
23
+ }
24
+
25
+ /**
26
+ * A prefix interval tree stores an numeric array and the partial sums of that
27
+ * array. It is optimized for updating the values of the array without
28
+ * recomputing all of the partial sums.
29
+ *
30
+ * - O(ln n) update
31
+ * - O(1) lookup
32
+ * - O(ln n) compute a partial sum
33
+ * - O(n) space
34
+ *
35
+ * Note that the sequence of partial sums is one longer than the array, so that
36
+ * the first partial sum is always 0, and the last partial sum is the sum of the
37
+ * entire array.
38
+ */
39
+ class PrefixIntervalTree {
40
+ private _size: number;
41
+ /**
42
+ * Half the size of the heap. It is also the number of non-leaf nodes, and the
43
+ * index of the first element in the heap. Always a power of 2.
44
+ */
45
+ private _half: number;
46
+ private _heap: number[];
47
+
48
+ private _maxUsefulLength: number;
49
+
50
+ private _onUpdateItemLayout: Function;
51
+ private _onUpdateIntervalTree: Function;
52
+
53
+ constructor(
54
+ xs: number[] | number,
55
+ opts?: {
56
+ onUpdateItemLayout?: Function;
57
+ onUpdateIntervalTree?: Function;
58
+ }
59
+ ) {
60
+ if (typeof xs === 'number') this.initWithNumber(xs);
61
+ if (Array.isArray(xs)) this.initWithArray(xs);
62
+
63
+ const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};
64
+ this._onUpdateIntervalTree = onUpdateIntervalTree;
65
+ this._onUpdateItemLayout = onUpdateItemLayout;
66
+ }
67
+
68
+ initWithNumber(length: number) {
69
+ this._half = ceilLog2(length);
70
+ this._size = this._half;
71
+ this._heap = createArray(2 * this._half);
72
+ this._maxUsefulLength = 0;
73
+ }
74
+
75
+ initWithArray(arr: number[]) {
76
+ this._half = ceilLog2(arr.length);
77
+ this._size = this._half;
78
+ this._heap = createArray(2 * this._half);
79
+ // this._maxUsefulLength = arr.length;
80
+ let i;
81
+ for (i = 0; i < this._size; ++i) {
82
+ this._heap[this._half + i] = arr[i];
83
+ }
84
+
85
+ for (i = this._half - 1; i > 0; --i) {
86
+ this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];
87
+ }
88
+ }
89
+
90
+ static uniform(size: number, initialValue: number) {
91
+ const xs = [];
92
+ for (let i = size - 1; i >= 0; --i) {
93
+ xs[i] = initialValue;
94
+ }
95
+
96
+ return new PrefixIntervalTree(xs);
97
+ }
98
+
99
+ static empty(size: number) {
100
+ return PrefixIntervalTree.uniform(size, 0);
101
+ }
102
+
103
+ stretch() {
104
+ const nextHeap = createArray(2 * this._half * 2);
105
+ const nextHeapHalf = this._half * 2;
106
+
107
+ // copy old value to new one
108
+ for (let i = 0; i < this._size; i++) {
109
+ nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;
110
+ }
111
+
112
+ // sum old value to create new sum value
113
+ for (let i = nextHeapHalf - 1; i > 0; i--) {
114
+ nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];
115
+ }
116
+
117
+ this._half = nextHeapHalf;
118
+ this._size = nextHeapHalf;
119
+ this._heap = nextHeap;
120
+ }
121
+
122
+ remove(index: number) {
123
+ if (index > this._size) return false;
124
+ const nextHeap = createArray(this._half * 2);
125
+
126
+ for (let i = 0; i < this._size; i++) {
127
+ let step = 0;
128
+ if (index === i) {
129
+ step = 1;
130
+ continue;
131
+ }
132
+ nextHeap[this._half + i - step] = this._heap[this._half + i] || 0;
133
+ }
134
+
135
+ for (let i = this._half - 1; i > 0; i--) {
136
+ nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];
137
+ }
138
+
139
+ this._heap = nextHeap;
140
+
141
+ this._maxUsefulLength = Math.max(0, this._maxUsefulLength - 1);
142
+
143
+ return true;
144
+ }
145
+
146
+ set(index: number, value: number) {
147
+ // if typeof index === 'undefined', then it will go into looooooooop
148
+ if (typeof index !== 'number') return;
149
+ if (isNaN(index)) {
150
+ console.warn('Passing a NaN value as interval tree index');
151
+ return;
152
+ }
153
+
154
+ while (index >= this._half) {
155
+ this.stretch();
156
+ }
157
+
158
+ let node = this._half + index;
159
+ this._heap[node] = value;
160
+
161
+ node = parent(node);
162
+ for (; node !== 0; node = parent(node)) {
163
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
164
+ }
165
+
166
+ if (index + 1 > this._maxUsefulLength) {
167
+ this._maxUsefulLength = index + 1;
168
+ }
169
+
170
+ if (typeof this._onUpdateIntervalTree === 'function') {
171
+ this._onUpdateIntervalTree(this._heap);
172
+ }
173
+
174
+ if (typeof this._onUpdateItemLayout === 'function') {
175
+ this._onUpdateItemLayout(index, value);
176
+ }
177
+ }
178
+
179
+ getMaxUsefulLength() {
180
+ return this._maxUsefulLength;
181
+ }
182
+
183
+ get(index: number) {
184
+ // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);
185
+
186
+ const node = this._half + index;
187
+ return this._heap[node];
188
+ }
189
+
190
+ getSize() {
191
+ return this._size;
192
+ }
193
+
194
+ getHalf() {
195
+ return this._half;
196
+ }
197
+
198
+ getHeap() {
199
+ return this._heap;
200
+ }
201
+
202
+ getMaxValue() {
203
+ return this._heap[1];
204
+ }
205
+
206
+ /**
207
+ * Returns the sum get(0) + get(1) + ... + get(end - 1).
208
+ */
209
+ sumUntil(end: number) {
210
+ // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);
211
+
212
+ if (end === 0) {
213
+ return 0;
214
+ }
215
+
216
+ let node = this._half + end - 1;
217
+ let sum = this._heap[node];
218
+
219
+ for (; node !== 1; node = parent(node)) {
220
+ if (node % 2 === 1) {
221
+ sum += this._heap[node - 1];
222
+ }
223
+ }
224
+
225
+ return sum;
226
+ }
227
+
228
+ /**
229
+ * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).
230
+ */
231
+ sumTo(inclusiveEnd: number) {
232
+ // invariant(
233
+ // inclusiveEnd >= 0 && inclusiveEnd < this._size,
234
+ // 'Index out of range %s',
235
+ // inclusiveEnd
236
+ // );
237
+ return this.sumUntil(inclusiveEnd + 1);
238
+ }
239
+
240
+ /**
241
+ * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).
242
+ */
243
+ sum(begin: number, end: number) {
244
+ // invariant(begin <= end, 'Begin must precede end');
245
+ return this.sumUntil(end) - this.sumUntil(begin);
246
+ }
247
+
248
+ /**
249
+ * Returns the smallest i such that 0 <= i <= size and sumUntil(i) <= t, or
250
+ * -1 if no such i exists.
251
+ */
252
+ greatestLowerBound(t: number) {
253
+ if (t < 0) {
254
+ return -1;
255
+ }
256
+
257
+ let node = 1;
258
+ if (this._heap[node] < t) {
259
+ // not use this._size;this._size always be a big value
260
+ return Math.max(this._maxUsefulLength - 1, 0);
261
+ }
262
+
263
+ // 这种写法的结果就是,如果中间一个item的length为0的话,那么它会一直往右边查;
264
+ // 比如初始化的时候是[0, 0, 0, 0, 0, 0, 0, 0];
265
+ // 你会发现node最后会是7,this._half为4;最终即使data没有数据,那么它的index算出来的也是
266
+ // 7 - 4 = 3;所以,考虑到会存在一些item length为0的情况,所以,这个其实是比较合理的方式,
267
+ // 拿右边的
268
+ while (node < this._half) {
269
+ const leftSum = this._heap[2 * node];
270
+ if (t < leftSum) {
271
+ node = 2 * node;
272
+ } else {
273
+ node = 2 * node + 1;
274
+ t -= leftSum;
275
+ }
276
+ }
277
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
278
+ }
279
+
280
+ /**
281
+ * Returns the smallest i such that 0 <= i <= size and sumUntil(i) < t, or
282
+ * -1 if no such i exists.
283
+ */
284
+ greatestStrictLowerBound(t: number) {
285
+ if (t <= 0) {
286
+ return -1;
287
+ }
288
+
289
+ let node = 1;
290
+ if (this._heap[node] < t) {
291
+ return Math.max(this._maxUsefulLength - 1, 0);
292
+ }
293
+
294
+ while (node < this._half) {
295
+ const leftSum = this._heap[2 * node];
296
+ if (t <= leftSum) {
297
+ node = 2 * node;
298
+ } else {
299
+ node = 2 * node + 1;
300
+ t -= leftSum;
301
+ }
302
+ }
303
+
304
+ return Math.min(node - this._half, this._maxUsefulLength - 1);
305
+ }
306
+
307
+ computeRange(minOffset: number, maxOffset: number) {
308
+ if (this.getHeap()[1] < minOffset) {
309
+ return {
310
+ startIndex: this._maxUsefulLength - 1,
311
+ endIndex: this._maxUsefulLength - 1,
312
+ };
313
+ }
314
+ const startIndex = this.leastStrictUpperBound(minOffset);
315
+ // end的话,需要把index + 1,这样才能够把自个也加进去
316
+ const endIndex = Math.min(
317
+ this.greatestStrictLowerBound(maxOffset),
318
+ Math.max(this._maxUsefulLength - 1, 0)
319
+ );
320
+
321
+ return {
322
+ startIndex: endIndex >= 0 ? Math.max(startIndex, 0) : -1,
323
+ endIndex,
324
+ };
325
+ }
326
+
327
+ /**
328
+ * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or
329
+ * size + 1 if no such i exists.
330
+ */
331
+ leastUpperBound(t: number) {
332
+ return this.greatestLowerBound(t) + 1;
333
+ }
334
+
335
+ /**
336
+ * Returns the smallest i such that 0 <= i <= size and t < sumUntil(i), or
337
+ * size + 1 if no such i exists.
338
+ */
339
+ leastStrictUpperBound(t: number) {
340
+ return this.greatestStrictLowerBound(t);
341
+ }
342
+ }
343
+
344
+ export default PrefixIntervalTree;