【问题标题】:What data-structure does the PHP array() constructor create? [duplicate]PHP array() 构造函数创建什么数据结构? [复制]
【发布时间】:2013-02-08 00:28:37
【问题描述】:

虽然我发现大多数 PHP 批评充其量是迂腐的,但缺乏清晰的数据结构排列正在成为我日常工作的实际限制。 array() 构造函数创建了声称可以做所有事情的数据结构,但实际上我最终缺乏为了有效使用它而需要的相关信息。 具体来说,我不知道它到底是什么数据结构。是清单吗?什么样的清单?指针数组?一棵树?哈希图?

如何执行查找?由于相同的数据结构具有数字和“关联”查找,我假设不能像在 C 数组中那样执行基于偏移量的查找。

对于少量的数据,我自然不会太在意这样的性能优化。但是,我开发的软件开始用于中等大的数据结构会减慢速度的场景。

此外,是否可以显式创建每个提到的数据结构?怎么样?

【问题讨论】:

标签: php arrays data-structures


【解决方案1】:

在 PHP 中,数组在内部表示为双向链表。有一些 SPL 类可让您创建 other data structures

PHP 的部分魔力在于不必选择不同的数据结构,但正如您所观察到的,它也存在性能限制。

【讨论】:

  • 您提供的链接明确与您的答案相矛盾。它说 PHP 数组是作为有序哈希表实现的。
  • 获取Sara Goldman's Extending & Embedding PHP 的副本。第 93 页 “HashTable 是一种特殊形式的双向链表,它以查找索引的形式增加了向量的速度和效率。”相信我,它们实际上是双向链表;即使它们在用户空间中显示为哈希表。
  • 虽然我明白你在说什么,但哈希表是与双向链表根本不同的数据结构,并且具有完全不同的性能特征。看起来 PHP 使用带有双向链表的哈希表,以便获得两种结构的性能优势。这是一个聪明的主意!
  • 是的,我知道它们非常不同;我拥有计算机科学学位。 PHP 中的 AFAIR 'everything' 是一个哈希表(根据 Sara,“所有用户空间变量都以 zval* 指针的形式存储在 HashTables 中。在后面的章节中,您将看到 Zend 引擎如何使用 HashTables 来存储用户空间函数、类,资源,自动全局标签和其他结构”);但在此之下,根据之前的评论,基础是双向链表。我不确定算法复杂性如何通过这种混合设置在现实世界中摆脱。将是一个很好的练习。
【解决方案2】:

我建议最好主要将数组视为哈希表实现,就像您花一点时间研究源代码一样,您会注意到虽然 Zend HT 可以作为 DLL 进行遍历,但您可能会执行的大多数操作有兴趣比较(添加、随机访问)的是典型的 HT 实现。

如果我们只处理数字键,那么它本质上是对 C 数组的传递,而不涉及哈希函数,在这种情况下,每个键将恰好有一个 HT 存储桶。当然,动态扩展数组的能力是通过定期的内存重新分配来促进的,所以你会在那里受到惩罚(如果你没有在 C++ 中预先分配一个大的 std::vector 可能会受到影响)。

HTH。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2016-10-22
    • 2013-10-13
    • 2021-05-14
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多