PHP array() 构造函数创建什么数据结构?

11 浏览
0 Comments

PHP array() 构造函数创建什么数据结构?

尽管我认为大部分PHP的批评都是纠结小节,但缺乏清晰的数据结构限制了我在日常工作中的实际应用。

array()构造函数创建了声称可以做任何事情的数据结构,但实际上我常常缺乏需要的相关信息以便高效使用它。

具体来说,我不知道它到底是什么样的数据结构。它是一个列表吗?什么样的列表?指针数组?B树?哈希映射?

查找是如何执行的?由于同一数据结构具有数字和“关联”查找,我认为无法像在C数组中那样基于偏移量进行查找。

对于少量数据,我自然不太关心这样的性能优化。然而,我所工作的软件开始在中等规模的数据结构中变慢。

此外,是否可以显式地创建每种提到的数据结构?如何创建?

0
0 Comments

PHP的数组构造函数array()创建的数据结构是哈希表实现。通过查看源代码,我们可以发现,虽然Zend哈希表可以像双向链表一样遍历,但大多数你可能感兴趣的操作(添加、随机访问)都是典型的哈希表实现。

当我们仅使用数字键时,它实际上是将其传递给一个C数组,而无需涉及哈希函数,此时每个键将有一个哈希表桶。当然,动态扩展数组的能力是通过定期内存重新分配来实现的,因此在这里你会遇到一些性能损失(就像在C++中没有预先分配大的std::vector时一样)。

希望对你有帮助。

0
0 Comments

PHP中,数组在内部表示为双向链表。有一些SPL类可以让你创建其他数据结构。

PHP的一部分魔力在于不需要选择不同的数据结构,但正如你所观察到的,它也带来了性能限制。

你提供的链接明确反驳了你的答案。它说PHP数组是作为有序哈希表实现的。

阅读Sara Goldman的《扩展和嵌入PHP》一书,第93页“哈希表是一种特殊形式的双向链表,它通过查找索引的形式添加了向量的速度和效率。”相信我,在底层它们是双向链表,即使它们在用户空间中看起来像哈希表。

虽然我明白你的意思,哈希表和双向链表在本质上是不同的数据结构,具有完全不同的性能特点。看起来PHP使用带有双向链表的哈希表,以同时获得两种结构的性能优势。这是一个巧妙的想法!

是的,我明白它们非常不同;我有计算机科学学位。据我记得,PHP中的“一切”都是一个哈希表(根据Sara的说法,“所有用户空间变量都以zval*指针的形式存储在HashTables中。在后面的章节中,你将看到Zend引擎如何使用HashTables来存储用户空间函数、类、资源、自动全局标签和其他结构”);但在这之下,底层是双向链表,正如前面的评论所述。我不确定这种混合设置在现实世界中的算法复杂度如何。找出来将是一个很好的练习。

0