2.0.0 • Published 5 years ago
sequenced-array v2.0.0
sequenced-array
The sequenced array class which maintains sorted order with time complexity O(logN) by using binary search algorithm.
In most situations, the worst-case performance is O(logN) except for the cases that there are <empty item>s in the array.
If each item of the array is an empty item which is the worst case, the time complexity is O(N), because we need to compare all items of the array to determine an insert point.
Install
$ npm i sequenced-arrayUsage
import SequencedArray from 'sequenced-array'new SequencedArray(arrayLength, {desc, compare})
new SequencedArray(array, {desc, compare})
class SequencedArray extends Array {}SequencedArray is a subclass of Array, so that its instances inherit all methods, getters and setters of normal arrays.
- desc
?boolean=falseWhether the array should be sorted in decending order. By defaultSequencedArrays are in ascending order. - compare
?Function=(a, b) => a - bThe compare function as the same as thecompareFunctionofArray.prototype.filter(compareFunction). So that we can compare array items which are not numbers.
Creates a SequencedArray
// creates an empty array
new SequencedArray([])
// or
new SequencedArray()
// creates an array of length 10 with 10 empty items.
new SequencedArray(10)
// creates an array of [1, 2, 3]
new SequencedArray([1, 2, 3])
// creates an order book which puts the highest bid at the top
const orderBook = new SequencedArray([], {
desc: true,
compare: (a, b) => a.price - b.price
})
orderBook.insert({price: 2, amount: 1})
orderBook.insert({price: 3, amount: 2})
orderBook.insert({price: 1, amount: 1})
console.log(orderBook[0]) // {price: 3, amount: 2}
console.log(orderBook[1]) // {price: 2, amount: 1}
console.log(orderBook[2]) // {price: 1, amount: 2}array.match(item, index): number | undefined
- item
any - index
number
Matches the item with array[index]
Returns
< 0indicates thatitemshould be before the indexindex= 0indicates thatitemequals the item at indexindex> 0indicates thatitemshould be after the indexindexundefinedindicates thatarray[index]is an empty item, so it is not matchable.
const arr = new SequencedArray(4)
arr[2] = 2
arr.match(5, 0) // undefined
arr.match(1, 2) // -1
arr.match(3, 2) // 1
arr.match(2, 2) // 0array.locate(item): number, number
Finds which location should item be located at.
Returns [min, max]
- If
minequals tomax, it indicates thatitemis equals toarray[min] - Otherwise, it indicates that
itemcould be inserted between indexminand indexmax
new SequencedArray([1, 2, 3, 4]).locate(2.5) // [1, 2]
new SequencedArray([1, 2, 3, 4]).locate(2) // [1, 1]
new SequencedArray([1, 2, 3, 4]).locate(0)
// [-1, 0]
// `0` should be placed before `1`(array[0])array.insert(item): {index: number, inserted: boolean}
Insert item into the array and maintains the sorting order.
Returns Object
- index
numberTheitemhas been located at indexindex - inserted
booleantruethe new item has been inserted into the arrayfalsetheitemequals toarray[index]and it is unnecessary to insert the item as a new one.
const a = new SequencedArray([1, 2, 3, 4])
a.insert(2.5)
// {
// index: 2,
// inserted: true
// }
// Then, the array is:
// [1, 2, 2.5, 3, 4]const b = new SequencedArray([1, 2, 3, 4])
b.insert(2)
// {
// index: 1,
// inserted: false
// }
// `2` is already located at index 1const c = new SequencedArray([])
c.insert(3)
c.insert(1)
c.insert(2)
// Then the array is: [1, 2, 3]
const d = new SequencedArray([], {desc: true})
c.insert(3)
c.insert(1)
c.insert(2)
// Then the array is: [3, 2, 1]License
MIT