@x-oasis/prefix-interval-tree 0.1.17 → 0.1.18
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/dist/prefix-interval-tree.cjs.development.js +3 -3
- package/dist/prefix-interval-tree.cjs.development.js.map +1 -1
- package/dist/prefix-interval-tree.cjs.production.min.js +1 -1
- package/dist/prefix-interval-tree.cjs.production.min.js.map +1 -1
- package/dist/prefix-interval-tree.esm.js +3 -3
- package/dist/prefix-interval-tree.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +4 -4
|
@@ -81,10 +81,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
81
81
|
var copy = this._heap.slice(this._half);
|
|
82
82
|
copy.splice(index, 1);
|
|
83
83
|
for (var _index = this._half; _index < this._half * 2; _index++) {
|
|
84
|
-
nextHeap[_index] = copy[_index - this._half];
|
|
84
|
+
nextHeap[_index] = copy[_index - this._half] || 0;
|
|
85
85
|
}
|
|
86
|
-
for (var _index2 = this._half - 1; _index2
|
|
87
|
-
nextHeap[_index2] =
|
|
86
|
+
for (var _index2 = this._half - 1; _index2 > 0; _index2--) {
|
|
87
|
+
nextHeap[_index2] = nextHeap[2 * _index2] + nextHeap[2 * _index2 + 1];
|
|
88
88
|
}
|
|
89
89
|
this._maxUsefulLength = this._maxUsefulLength - 1;
|
|
90
90
|
this._heap = nextHeap;
|
|
@@ -1 +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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half];\n }\n for (let index = this._half - 1; index >= 0; index--) {\n nextHeap[index] =\n (nextHeap[2 * index] || 0) + (nextHeap[2 * index + 1] || 0);\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
@@ -1,2 +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=[],i=t-1;i>=0;--i)e[i]=0;return e};function i(t){for(var e=1;e<t;)e*=2;return e}exports.default=function(){function h(t,e){"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var i=e||{},h=i.onUpdateItemLayout;this._onUpdateIntervalTree=i.onUpdateIntervalTree,this._onUpdateItemLayout=h}var n=h.prototype;return n.initWithNumber=function(t){this._half=i(t),this._size=this._half,this._heap=e(2*this._half),this._maxUsefulLength=0},n.initWithArray=function(t){var h;for(this._half=i(t.length),this._size=this._half,this._heap=e(2*this._half),h=0;h<this._size;++h)this._heap[this._half+h]=t[h];for(h=this._half-1;h>0;--h)this._heap[h]=this._heap[2*h]+this._heap[2*h+1]},h.uniform=function(t,e){for(var i=[],n=t-1;n>=0;--n)i[n]=e;return new h(i)},h.empty=function(t){return h.uniform(t,0)},n.stretch=function(){for(var t=e(2*this._half*2),i=2*this._half,h=0;h<this._size;h++)t[i+h]=this._heap[this._half+h]||0;for(var n=i-1;n>0;n--)t[n]=t[2*n]+t[2*n+1];this._half=i,this._size=i,this._heap=t},n.remove=function(t){if(!("number"!=typeof t||t>=this._maxUsefulLength))if(isNaN(t))console.warn("Passing a NaN value as interval tree index");else{var i=e(2*this._half),h=this._heap.slice(this._half);h.splice(t,1);for(var n=this._half;n<2*this._half;n++)i[n]=h[n-this._half];for(var a=this._half-1;a
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=function(t){return Math.floor(t/2)},e=function(t){for(var e=[],i=t-1;i>=0;--i)e[i]=0;return e};function i(t){for(var e=1;e<t;)e*=2;return e}exports.default=function(){function h(t,e){"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var i=e||{},h=i.onUpdateItemLayout;this._onUpdateIntervalTree=i.onUpdateIntervalTree,this._onUpdateItemLayout=h}var n=h.prototype;return n.initWithNumber=function(t){this._half=i(t),this._size=this._half,this._heap=e(2*this._half),this._maxUsefulLength=0},n.initWithArray=function(t){var h;for(this._half=i(t.length),this._size=this._half,this._heap=e(2*this._half),h=0;h<this._size;++h)this._heap[this._half+h]=t[h];for(h=this._half-1;h>0;--h)this._heap[h]=this._heap[2*h]+this._heap[2*h+1]},h.uniform=function(t,e){for(var i=[],n=t-1;n>=0;--n)i[n]=e;return new h(i)},h.empty=function(t){return h.uniform(t,0)},n.stretch=function(){for(var t=e(2*this._half*2),i=2*this._half,h=0;h<this._size;h++)t[i+h]=this._heap[this._half+h]||0;for(var n=i-1;n>0;n--)t[n]=t[2*n]+t[2*n+1];this._half=i,this._size=i,this._heap=t},n.remove=function(t){if(!("number"!=typeof t||t>=this._maxUsefulLength))if(isNaN(t))console.warn("Passing a NaN value as interval tree index");else{var i=e(2*this._half),h=this._heap.slice(this._half);h.splice(t,1);for(var n=this._half;n<2*this._half;n++)i[n]=h[n-this._half]||0;for(var a=this._half-1;a>0;a--)i[a]=i[2*a]+i[2*a+1];this._maxUsefulLength=this._maxUsefulLength-1,this._heap=i}},n.set=function(e,i){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 h=this._half+e;for(this._heap[h]=i,h=t(h);0!==h;h=t(h))this._heap[h]=this._heap[2*h]+this._heap[2*h+1];e+1>this._maxUsefulLength&&(this._maxUsefulLength=e+1),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout&&this._onUpdateItemLayout(e,i)}},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(e<=0)return 0;for(var i=this._half+e-1,h=this._heap[i];1!==i;i=t(i))i%2==1&&(h+=this._heap[i-1]);return h},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 i=this._heap[2*e];t<i?e*=2:(e=2*e+1,t-=i)}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 i=this._heap[2*e];t<=i?e*=2:(e=2*e+1,t-=i)}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 i=this.leastStrictUpperBound(t),h=Math.min(this.leastStrictUpperBound(e),Math.max(this._maxUsefulLength-1,0));return{startIndex:h>=0?Math.max(i,0):-1,endIndex:h}},n.leastUpperBound=function(t){return this.greatestLowerBound(t)+1},n.leastStrictUpperBound=function(t){return this.greatestStrictLowerBound(t)},h}();
|
|
2
2
|
//# sourceMappingURL=prefix-interval-tree.cjs.production.min.js.map
|
|
@@ -1 +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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half];\n }\n for (let index = this._half - 1; index >= 0; index--) {\n nextHeap[index] =\n (nextHeap[2 * index] || 0) + (nextHeap[2 * index + 1] || 0);\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
@@ -77,10 +77,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
77
77
|
var copy = this._heap.slice(this._half);
|
|
78
78
|
copy.splice(index, 1);
|
|
79
79
|
for (var _index = this._half; _index < this._half * 2; _index++) {
|
|
80
|
-
nextHeap[_index] = copy[_index - this._half];
|
|
80
|
+
nextHeap[_index] = copy[_index - this._half] || 0;
|
|
81
81
|
}
|
|
82
|
-
for (var _index2 = this._half - 1; _index2
|
|
83
|
-
nextHeap[_index2] =
|
|
82
|
+
for (var _index2 = this._half - 1; _index2 > 0; _index2--) {
|
|
83
|
+
nextHeap[_index2] = nextHeap[2 * _index2] + nextHeap[2 * _index2 + 1];
|
|
84
84
|
}
|
|
85
85
|
this._maxUsefulLength = this._maxUsefulLength - 1;
|
|
86
86
|
this._heap = nextHeap;
|
|
@@ -1 +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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half];\n }\n for (let index = this._half - 1; index >= 0; index--) {\n nextHeap[index] =\n (nextHeap[2 * index] || 0) + (nextHeap[2 * index + 1] || 0);\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
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 typeof index === 'undefined', then it will go into looooooooop\n if (typeof index !== 'number' || index >= this._maxUsefulLength) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._maxUsefulLength = this._maxUsefulLength - 1;\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 * End is not included. if end less than 0, then return 0\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 /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 100, 100, 100, 100].\n * this.leastStrictUpperBound(330) = 3\n * this.leastStrictUpperBound(400) = 3 (should be 4....)\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\n // end的话,需要把index + 1,这样才能够把自个也加进去\n const endIndex = Math.min(\n this.leastStrictUpperBound(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","isNaN","console","warn","copy","slice","splice","set","value","getMaxUsefulLength","get","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","startIndex","endIndex","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -131,11 +131,11 @@ class PrefixIntervalTree {
|
|
|
131
131
|
const copy = this._heap.slice(this._half);
|
|
132
132
|
copy.splice(index, 1);
|
|
133
133
|
for (let index = this._half; index < this._half * 2; index++) {
|
|
134
|
-
nextHeap[index] = copy[index - this._half];
|
|
134
|
+
nextHeap[index] = copy[index - this._half] || 0;
|
|
135
135
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
|
|
137
|
+
for (let index = this._half - 1; index > 0; index--) {
|
|
138
|
+
nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
this._maxUsefulLength = this._maxUsefulLength - 1;
|