集合的查找应该为 O(1)。 这是任何语言中集合和哈希表(例如映射)的真实情况。
这是可能的,因为集合以与数组不同的方式存储值。
在数组中,值是根据其在数组中的位置和该数组在内存中的位置顺序存储的,因此要找到你的项目,你需要顺序扫描数组以找到你的项目(除非它是排序数组,然后你可以使用 O(logn) 的二分搜索)。
集合声明一块内存,就像数组一样,但它们不是像数组一样将项目按顺序放到内存中,而是通过运行项目通过哈希函数(本质上是一个将对象作为输入并返回一个均匀分布的、非常大的随机数的函数)来确定要添加项目的索引,然后对该哈希函数的结果取模,取模的值为它们拥有的内存块的大小。
因此,当你调用 contains($needle, $mySetHaystack) 时,php 会获取 $needle,并将其输入哈希函数,该函数将返回一个很大的数字,例如 9283472378,然后它获取 $mySetHaystack 的长度(假设为 31),并执行 9283472378 % 31 = 28,因此它检查 $mySetHaystack 的第 28 个索引以查看 $needle 是否在那里。 此列表中的所有操作都独立于 $mySetHaystack 的大小,因此性能为 O(1)。
如果哈希函数对两个不同的项目返回相同的值(哈希冲突,这种情况肯定会发生),或者如果该值的模相同,则集合中的该索引处会存储一个值的数组。 由于集合不允许重复值,因此这种情况很少发生,从性能的角度来看可以忽略不计。
你应该查看维基百科关于哈希表的页面(类似于集合),因为有很多图片可以使这个概念更容易理解。