想象一下,您要搜索一個包含N個元素的數組,並對數組值執行Y搜索以查找相應的鍵;您可以執行Y array_search
's或做一個array_flip
和Y直接查找。爲什麼第一種方法比第二種方法慢?有沒有第一種方法比第二種方法快的情況? 你可以假設鍵和值是唯一的是否有一種情況下array_search比連續array_flip和直接查找更快?
7
A
回答
7
數組鍵被散列,所以查找它們只需要調用散列函數並將索引編入散列表。所以array_flip()
是O(N),查找陣列鍵是O(1),所以Y
搜索是O(Y)+ O(N)。
數組值不被散列,因此搜索它們需要線性搜索。這是O(N),所以Y搜索是O(N * Y)。
假設要搜索的值在數組中均勻分佈,則線性搜索的平均情況必須比較N/2個元素。所以array_flip()
應該需要大約2 array_search()
調用的時間,因爲它必須檢查N個元素。
創建哈希表時會有額外的開銷。但是,PHP使用寫時複製,所以它不需要在array_flip()
期間複製密鑰或值,所以它不是太糟糕。對於少數查找,第一種方法可能會更快。你必須以此爲基準找到盈虧平衡點。
相關問題
- 1. rails 3 ...在這種情況下,兩個查詢比一個更快嗎?
- 2. 在哪些情況下,CPU直接傳輸的工作速度比DMA快?在什麼情況下,DMA傳輸比CPU直接傳輸更快?
- 3. 在這種情況下AddRange()比ToList()更快嗎?
- 4. 在這種情況下,Regex比數組比較快嗎?
- 5. 在這種情況下哪種數據庫連接方法更有效?
- 6. 是否有可能使一個XSS在這種情況下
- 7. Scala 2.10.0編譯器在哪種情況下可能比2.9.2更快或更慢?
- 8. 在沒有mysqli_pconnect的情況下持續連接到MYSQL
- 9. 爲什麼在這種情況下枚舉比HashMap更有用?
- 10. 爲什麼int和uint比較在一種情況下失敗,而在另一種情況下不能?
- 11. 在這種情況下,下推自動機是否有用?
- 12. 檢查是否有一個有效的互聯網連接iPhone的情況
- 13. 是在這種情況下
- 14. 在這種情況下,如何獲得「while」比光標快?
- 15. 在這種情況下,MyISAM比mysql中的InnoDB快得多
- 16. SQL Server在這種特定情況下是否會一直短路?
- 17. 和|| =在這種情況下
- 18. 在這種情況下是否需要調用flush()(JPA接口)?
- 19. 在這種情況下反規格化是否可接受?
- 20. 是否可以在沒有JCO的情況下連接SAP Server和JAVA?
- 21. 在這種情況下比較字符串指針是否有效?
- 22. 比較在兩種情況下
- 23. 在哪種情況下LFU比LRU好?
- 24. 三種查詢比一種更快 - 我的聯接有什麼錯誤?
- 25. 在下列情況下哪個更快?
- 26. 哪種情況更有效?
- 27. JavaScript - 是否可以在不使用OR的情況下在一種情況下檢查多個工作日?
- 28. 什麼是這種情況下更好的ActiveRecord查詢
- 29. 函數查找()在所有情況下
- 30. 在這種情況下,OAuth和OpenID是否正確?
這是一個有趣的問題。你有任何性能測試證明這一點?另外,你在做這個檢查時是否使用了嚴格的選項? –
@Daryl Gill你爲什麼編輯我的問題?實際上,我的意思是N查找和N次搜索,現在如果將其編輯回原始狀態,所有這些討論都將失效。 – EnJayz
我只是想說一句:'你可以假定鍵和值是唯一的':這非常重要:如果值不是唯一的,那麼當執行'array_flip'時,由於各種值會丟失一些項目將最終結束在同一個關鍵中,後者會覆蓋前者。 –