集合的查找應該是 O(1)。這適用於任何語言的集合和雜湊表(例如映射)。
這是可能的,因為集合儲存值的方式與陣列不同。
在陣列中,值的儲存方式是基於它們在陣列中的位置以及該陣列在記憶體中的位置而依序排列的,因此要找到您的項目,您需要依序掃描整個陣列(除非它是一個已排序的陣列,那麼您可以使用二元搜尋,其時間複雜度為 O(logn))。
集合(Set)會宣告一個記憶體區塊,就像陣列一樣,但它並不像陣列那樣依序將項目放入記憶體,而是透過將項目傳入雜湊函式(本質上是一個接受物件並返回均勻分佈的非常大的隨機數的函式)來決定要新增項目的索引,然後將該雜湊函式的結果除以它們擁有的記憶體區塊大小的餘數。
因此,當您呼叫 contains($needle, $mySetHaystack) 時,PHP 會將 $needle 傳入雜湊函式,該函式會返回一個很大的數字,例如 9283472378,然後它會取得 $mySetHaystack 的長度(假設為 31),並執行 9283472378 % 31 = 28,因此它會檢查 $mySetHaystack 的第 28 個索引,看看 $needle 是否在那裡。此操作列表中的所有操作都與 $mySetHaystack 的大小無關,因此效能為 O(1)。
如果雜湊函式針對兩個不同的項目返回相同的值(雜湊碰撞,這完全有可能發生),或者如果該值的餘數相同,則會在該索引的集合中儲存一個值陣列。由於集合不允許重複值,因此這種情況很少發生,並且從效能的角度來看可以忽略不計。
您應該查看維基百科上關於雜湊表(類似於集合)的頁面,因為有很多圖片可以讓您更容易理解這個概念。