手指维克( TypeScript)
一种持久性(不可移动、结构共享)矢量,用于 卡尔西特 JavaScript 运行时间. 它取代了列表中 @calcit/ternary-tree (英语)罗斯特双胞胎住在 手指维克.rs;两者都使用相同的布局和算法.
版式
front buffer | relaxed B-tree of chunks | back buffer
- 元素生活在多达32个物项的块中;32个或更少的物项清单是一个阵列.
- 中间是松散的B-树(分支因子32,累积大小,所有叶子都在同一深度),和RRB矢量一样.
- 两端的缓冲使得推力和弹出都变得便宜. 附加到最新版本的列表会写入自己的后排而非复制;更古老的版本从不读过自己的结尾,因此不会受到影响.
- 接合会沿着接合线相接,并合并了那里的节点,因此接合环会保持高度对数.
| 运行 | 费用 |
|---|---|
get, (中文(简体) ), assoc | O(log₃₂ n) |
pushLeft, (中文(简体) ), pushRight, (中文(简体) ), dropLeft, (中文(简体) ), dropRight | 摊销 O(1) 加块复制件 |
concat, (中文(简体) ), split, (中文(简体) ), slice, (中文(简体) ), insert, (中文(简体) ), dissoc | O(log n) |
FingerVec.from(array) | O(n) |
使用量
import { FingerVec } from "@calcit/finger-vec";
const xs = FingerVec.of(1, 2, 3);
const ys = xs.pushRight(4).pushLeft(0);
ys.toArray(); // [0, 1, 2, 3, 4]
xs.len(); // 3, unchanged
const [left, right] = ys.split(2);
left.concat(right).equals(ys); // true
ys.slice(1, 3).toArray(); // [1, 2]
for (const x of ys) console.log(x);
主要方法: len, (中文(简体) ), get, (中文(简体) ), first, (中文(简体) ), last, (中文(简体) ), pushLeft编号 :prepend, (中文(简体) ), pushRight编号 :append, (中文(简体) ), dropLeft, (中文(简体) ), dropRight, (中文(简体) ), rest, (中文(简体) ), butlast, (中文(简体) ), assoc, (中文(简体) ), dissoc, (中文(简体) ), insert(idx, item, after), (中文(简体) ), insertAt, (中文(简体) ), assocBefore, (中文(简体) ), assocAfter, (中文(简体) ), split, (中文(简体) ), slice, (中文(简体) ), take, (中文(简体) ), skip, (中文(简体) ), concat, (中文(简体) ), FingerVec.concatAll, (中文(简体) ), reverse, (中文(简体) ), map, (中文(简体) ), forEach, (中文(简体) ), findIndex, (中文(简体) ), indexOf, (中文(简体) ), toArray, (中文(简体) ), equals, (中文(简体) ), items() 财务报告和审定财务报表 for...of。 。 。 . get 返回时 undefined 超出范围; rest, (中文(简体) ), butlast, (中文(简体) ), assoc, (中文(简体) ), dissoc, (中文(简体) ), insert 财务报告和审定财务报表 slice 丢入无效的输入,匹配所使用的三角树函数 Calcit .
业绩
对照 @calcit/ternary-tree 0.0.26 在节点22上,Linux x86-64,单跑:
| 大小写 | 三角树 | 手指维克 | 加速 |
|---|---|---|---|
| 附录 100k | 70.00分钟 | 24.87分钟 | 2.8× (中文(简体) ) |
| 预花100k | 82.35毫秒 | 48.84毫秒 | 1.7× (中文(简体) ) |
| 从阵列 100k | 19.46分钟 | 0.95 分钟 | 20× (英语) |
随机 get 100k (100克) (100克) | 58.10毫秒 | 20.59分钟 | 2.8× (中文(简体) ) |
rest 直到空出, 100克 | 32.91毫秒 | 18.94毫秒(每分钟) | 1.7× (中文(简体) ) |
随机 assoc 100k (100克) (100克) | 148.21 毫秒 | 90.48分钟 | 1.6× (中文(简体) ) |
concat acc [x] 五千块 get 每个项目 | 118.18毫秒 | 1.65毫秒(每分钟一秒) | 72× (中文(简体) ) |
| 在中间3k插入 | 174.84分钟 | 32.33分钟 | 5.4× (中文(简体) ) |
| 队列: 附加+休息 100k | 110.77毫秒 | 22.44分钟 | 4.9× (中文(简体) ) |
| 32 项列表: 从数组 x300k | 543.96 毫秒(秒数) | 30.94毫秒(每秒) | 18× (中文(简体) ) |
| 8 个项目列表: 附加到同一基数×300k | 24.65毫秒 | 48.42分钟 | 0.5× (中文(简体) ) |
concat acc [x] 5k 调用 | 6.33 分钟 | 9.41分钟 | 0.7× (中文(简体) ) |
重复复制到一个共享的小列表中 每次复制它的块, 它比Ternary-tree的小节点慢。 另一方面,三重树在5000个凸起后会达到2,501个深度,在几千个中间插入后会溢出堆栈; FingerVec会停留在3–4深度. 运行 npm run bench 给机器上的指纹号码.
发展
QQ 类型脚本QQ npm run test:package 焦油弹 焦油弹 节点-; 。
发布通过 .github/workflows/npm-publish.yaml 空虚 npm OIDC 信任的出版, QQ sord。
npm ch 信任的出版商 qq calcit-lang/finger-vec.ts 和文件名 npm-publish.yaml; 当前工作 43. GitHub Environment, 该选项留空。保存配置后可通过 发布QQ工作流程;2FA QQ。
npm install
npx tsc
node lib/test.mjs
node lib/bench.mjs
测试将随机操作序列与阵列进行比较,在每个步骤后检查结构变异性,并申明深度界限来进行接合循环和中间插入.
许可证
麻省理工学院