- 假設我們有非常大的的NSDictionary,當我們要調用objectForKey方法,它將使在覈心地段操作來獲得價值?或者它會直接指向內存中的值?
- 它是如何工作在覈心?
回答
的Collections Programming Topics for Core Foundation(你應該看看,如果你想知道更多)的CFDictionary款規定:
一個字典的該CFDictionary的對象類型是基於散列的 集合,其鍵用於訪問它的值是任意的,程序定義的數據片段(或指向數據的指針)是 。雖然密鑰 通常是一個字符串(或者在Core Foundation中是一個CFString對象),但它可以是任何可以放入指針大小的東西 - 一個整數,一個對Core Foundation對象的引用,甚至一個指針到數據 結構(不太可能如此)。
這是維基百科不得不說的哈希表:
理想情況下,哈希函數應該映射每個可能的密鑰,以獨特的 插槽指數,但這個理想在實踐中很少能夠實現(除非 散列鍵是固定的;也就是說,新條目在創建之後從不添加到表 )。相反,大多數散列表設計假設散列衝突 - 映射到相同散列值的不同鍵 - 將會發生並且必須以某種方式適應。在尺寸良好的散列表 表中,每次查找的平均成本(指令數)爲 ,與表中存儲的元素數無關。許多散列表設計還允許以每 操作的恆定平均(實際上,攤銷)成本任意插入和刪除 鍵值對。
因此,性能取決於散列的質量。如果它是好的,那麼訪問元素應該是O(1)操作(即不依賴於元素的數量)。
編輯:
事實上進一步閱讀的集合編程的核心基礎課題後,蘋果給出了一個回答你的問題:
在一個CFDictionary對象的值的訪問時間肯定 對於任何實現都是最差O(logN),但通常是O(1) (恆定時間)。插入或刪除操作通常也在 恆定時間,但在最壞的情況下是O(N * log N)。通過密鑰訪問值的速度比直接訪問值要快 。 字典傾向於使用比具有相同數量值的數組更多的內存。
NSDictionary
本質上是一個哈希表結構,因此查找的Big-O是O(1)。但是,爲了避免重新分配(並且要實現O(1))的複雜性,您應該使用dictionaryWithCapacity:
創建一個與您的數據集的大小相適應的新字典。
使用dictionaryWithCapacity將在正常情況下提供最小乃至沒有性能提升。事實上,蘋果公司的文件稱這只是一個暗示。我已經用10到10,000,000的NSArray大小進行了基準測試,發現沒有任何有意義的優勢。主要的缺點是花費在計算上的時間和思考花費更好。 – zaph
無論表的大小如何,您都無法保證表中不會出現衝突。 –
- 1. EXC_BAD_ACCESS while NSDictionary objectForKey - 但對象是那裏
- 2. 對於大量數據,matplotlib散點圖是否緩慢?
- 3. NSDictionary objectForKey返回值
- 4. NSDictionary不區分大小寫objectForKey:
- 5. NSDictionary的objectForKey是查找引用還是基於值?
- 6. ember.js對於大數據非常緩慢
- 7. cplex.linear_constraints.add對於大型模型太慢
- 8. NSDictionary objectForKey回答隨機
- 9. 的NSDictionary objectForKey不工作
- 10. 無法從NSDictionary獲取objectForKey
- 11. NSDictionary objectForKey拋出異常
- 12. AddTimestampToStaticLinks是否緩慢?
- 13. MySQLdb對於大型結果集極其緩慢
- 14. AndEngine更新線程對於大型精靈緩慢工作
- 15. NSDictionary的objectForKey:依賴於身份還是相等?
- 16. NetLogo對於大型模擬是否太慢?我如何加速NetLogo模型?
- 17. Django的QuerySets是否足夠緩慢以應對大數據集?
- 18. Flex是否緩慢(加載)?
- 19. 較大的對象是否較慢(C++)?
- 20. boto是否對大文件很慢?
- 21. 由於NSDictionary嵌套數據,UITableView滾動緩慢?
- 22. NSDictionary objectForKey返回錯誤的值
- 23. nsdictionary objectforkey - 搜索並獲得該值
- 24. NSDictionary objectForKey iPhone模擬器和iPhone設備
- 25. 的NSDictionary objectForKey將返回空值
- 26. NSString循環字符和NSDictionary objectForKey
- 27. NSDictionary objectForKey/valueForKey已經格式化了嗎?
- 28. objectForKey返回null,但nsdictionary已滿
- 29. 如何從NSDictionary中使用ObjectForKey
- 30. 緩慢導入大型MySQL轉儲
清除!謝謝! ;) –
它顯示O(log N)或O(1)的事實讓我懷疑它們是否有紅黑樹實現,或者如果日誌N佔重複鏈。 –
@JustinMeiners最糟糕的情況是對於散列衝突 – JustSid