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