跳转到内容

Block-Deque<T>

BlockDeque 是一种基于分块技术的线性容器。它结合了 BlockList 的严格 O(1) 随机访问特性与原生 Deque 的高效双端操作能力,是双端操作和高频寻址场景下的终极解决方案。

通过分块技术,我们可以分摊内存重排的开销,将插入、删除的复杂度维持在 O(B/w + N/B)。同时,保证在靠近两端时仍然能保持高效的插入和删除性能,见 基准测试

export class BlockDeque<T> extends InternalIterable<T>;
方法描述
constructor(blockSize = 512)构造实例。blockSize 会被自动向上取整到 2 的幂。
方法描述复杂度
at(index)访问指定位置的元素,支持负数索引。O(1)
get(index)访问指定位置的元素。O(1)
set(index, value)替换指定位置的元素。O(1)
方法描述复杂度
push(…values)在尾部添加元素。均摊 O(1)
pushAll(values[])在尾部添加元素。均摊 O(1)
pop()弹出尾部元素。均摊 O(1)
unshift(…values)在头部插入元素。均摊 O(1)
shift()弹出头部元素。均摊 O(1)
insert(index, value)在指定位置插入。O(B + N/B)
delete(index)删除指定位置的元素,并返回它。O(B + N/B)
deleteCursor(cur)删除游标指向的元素,并返回它。O(B + N/B)
方法描述复杂度
splice(start, count?, …items)切片修改. 支持批量删除和插入.O(K · N/B)
spliceAll(start, count?, items[])切片修改. 支持批量删除和插入.O(K · N/B)
slice(start?, end?)返回一个指定范围的浅拷贝 BlockDequeO(K)
concat(…items)拼接元素、数组、或 BlockDeque
返回一个新的 BlockDeque
O(K)
reverse()原地反转容器内的所有元素。O(N)
rebase(newBlockSize?)重新组织底层块存储。修改 blockSizeO(N)
方法描述
cursor(index?)返回双向随机访问游标。
[Symbol.iterator]返回原生迭代器。
方法描述复杂度
length返回元素总数。O(1)
capacity返回当前对象池能容纳的最大元素数(无新分配)。O(1)
isEmpty()检查列表是否为空。O(1)
resize(newSize, fillValue?)调整容器大小。缩小时截断数据,扩大时填充 fillValueO(K)
reserve(n)预分配物理块,确保至少能容纳 n 个元素。O(N)
shrinkToFit()释放内存池中闲置的物理块,等待 GC。O(1)
clear(reuse?)清空容器,reuse 控制是否保留物理块。O(1) 或 O(N)