charm/vector

这是一个向量实现,针对随机访问读取、pop()、push()、shift() 和 unshift() 等操作进行了优化,以实现 O(1) 的性能。

2.0.1 2024-05-28 11:48 UTC

This package is auto-updated.

Last update: 2024-08-28 12:23:21 UTC


README

一个快速且内存高效的向量实现,对于 prepend、append、shift、unshift 和随机访问等操作具有 O(1) 的性能。

底层数据结构内存高效,并且比在数组上使用 array_shiftarray_unshift 等操作快得多。

这个向量类利用 PHP 7 的 "打包数组" 实现了一个向量,在向量最擅长的操作上具有极高的性能,同时还能提供对向量中每个元素的即时访问。

性能和内存使用

内存使用与 PHP 数组的内存使用大致相同。《Ds\Vector》PECL 库的内存占用略低,但某些操作的速度要慢得多。

拥有 10K 项

实现追加移位前置
PHP 数组0.00144 秒0.277270.41853
《Ds\Vector》PECL 库0.00127 秒0.036830.03862
《Charm\Vector》0.004400.00180 秒0.00239 秒

拥有 50K 项

实现追加移位前置
PHP 数组0.01462 秒7.7003426.3000
《Ds\Vector》PECL 库0.00668 秒0.983720.90171
《Charm\Vector》0.032840.01046 秒0.01632 秒

向量

向量数据结构是队列和栈的内存高效替代方案。它比链表更快、更节省内存,并且具有以下 O(1) 性能特性:

  • 前置
  • 追加
  • 从底部移除项
  • 从顶部弹出项

比链表更好

  • 随机访问第 n 项是 O(1)。

与链表的扩展性相同 O(n),但可能略慢

  • 移除第 n 项。

比具有 O(n) 对 O(1) 的链表更差

  • 从双链表中移除项时,您已经有了对项的引用,只需修改一些指针引用即可。
  • 向量将需要使用 array_splice 函数将所有项移动一个偏移量。

全面测试覆盖

单元测试应该覆盖大多数(如果不是所有)使用向量的变体。