https://github.com/obsius/score-heap
A heap optimized for frequent updates.
https://github.com/obsius/score-heap
Last synced: 5 months ago
JSON representation
A heap optimized for frequent updates.
- Host: GitHub
- URL: https://github.com/obsius/score-heap
- Owner: obsius
- Created: 2023-09-28T03:44:55.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-07-23T02:12:14.000Z (almost 2 years ago)
- Last Synced: 2025-07-06T11:50:24.605Z (12 months ago)
- Language: JavaScript
- Size: 12.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ScoreHeap
A heap optimized for frequent updates.
Maintains a sorted list with partitions so only items within a modified partition need to be reindexed.
Returns the highest score (int32) in the heap, else null if the heap is empty.
### Working Example
```js
import ScoreHeap from 'score-heap';
let objs = [];
let scores = [];
// make a million entries with score = array index
for (let i = 0; i < 1000000; ++i) {
// this is the source array, the entries can be anything
objs.push({ i });
// initial scores will be passed into the new ScoreHeap below (a score must always be an int32)
scores.push([i, i]);
}
// construct a ScoreHeap with objs scores and a max length
let heap = new ScoreHeap(scores, scores.length);
console.time();
// get the next highest scoring index and remove it, then update the next entry with a random score
// 1M next() + remove() + update() each
for (let i; (i = heap.next()) != null;) {
heap.remove(i, objs[i].i);
if (i < objs.length - 1) {
heap.update(i + 1, Math.floor(Math.random() * objs.length));
}
}
console.timeEnd();
// ScoreHeap does not care about your underlying data structure.
// Its only purpose is to make retrieving, updating, and removing scored array entries as fast as possible.
```
## Methods
### constructor(indexScores, maxLength)
Make a new ScoreHeap.
`indexScores` An array of [index, score] to build the heap from (score must be an int32)
`maxLength` The length of the underlying (unpassed) source array (must never expand beyond this value)
Returns a new ScoreHeap.
### next()
Get the highest scoring index.
Returns the index with the highest score in the heap.
### update(index, score)
Update an index in the heap (index does not have to be in the heap yet).
`index` Index to update (or insert)
`score` Score of the index (must be an int32)
### remove(index)
Remove an index from the heap.
`index` Index to remove
Returns the index passed in if successful, else undefined.
## Performance
...
## TODO
...
## Contributing
Feel free to make changes and submit pull requests whenever.
## License
ScoreHeap uses the [MIT](https://opensource.org/licenses/MIT) license.