PHP array() 构造函数创建什么数据结构?
PHP array() 构造函数创建什么数据结构?
尽管我认为大部分PHP的批评都是纠结小节,但缺乏清晰的数据结构限制了我在日常工作中的实际应用。
array()构造函数创建了声称可以做任何事情的数据结构,但实际上我常常缺乏需要的相关信息以便高效使用它。
具体来说,我不知道它到底是什么样的数据结构。它是一个列表吗?什么样的列表?指针数组?B树?哈希映射?
查找是如何执行的?由于同一数据结构具有数字和“关联”查找,我认为无法像在C数组中那样基于偏移量进行查找。
对于少量数据,我自然不太关心这样的性能优化。然而,我所工作的软件开始在中等规模的数据结构中变慢。
此外,是否可以显式地创建每种提到的数据结构?如何创建?
PHP中,数组在内部表示为双向链表。有一些SPL类可以让你创建其他数据结构。
PHP的一部分魔力在于不需要选择不同的数据结构,但正如你所观察到的,它也带来了性能限制。
你提供的链接明确反驳了你的答案。它说PHP数组是作为有序哈希表实现的。
阅读Sara Goldman的《扩展和嵌入PHP》一书,第93页“哈希表是一种特殊形式的双向链表,它通过查找索引的形式添加了向量的速度和效率。”相信我,在底层它们是双向链表,即使它们在用户空间中看起来像哈希表。
虽然我明白你的意思,哈希表和双向链表在本质上是不同的数据结构,具有完全不同的性能特点。看起来PHP使用带有双向链表的哈希表,以同时获得两种结构的性能优势。这是一个巧妙的想法!
是的,我明白它们非常不同;我有计算机科学学位。据我记得,PHP中的“一切”都是一个哈希表(根据Sara的说法,“所有用户空间变量都以zval*
指针的形式存储在HashTables
中。在后面的章节中,你将看到Zend引擎如何使用HashTables
来存储用户空间函数、类、资源、自动全局标签和其他结构”);但在这之下,底层是双向链表,正如前面的评论所述。我不确定这种混合设置在现实世界中的算法复杂度如何。找出来将是一个很好的练习。