我想知道什麼是通過NSSet進行迭代的大O符號。 NSArray的答案顯然是O(n) - 但NSSet的答案是什麼? 另外 - 我假設相同的答案將適用於NSDictionary?什麼是通過NSSet和NSDictionary進行迭代的大O符號
回答
通過查看橋接Core Foundation等效項的標題中的註釋(因爲它們本質上使用相同的代碼),您可以瞭解Apple數據結構的計算複雜性。
有趣的是,CFArray
時間複雜度是不實際上保證是O(N):
計算複雜
爲所述陣列中的值的訪問時間是保證在 對於任何實施,當前和未來來說最差的O(lg N),但是 通常是O(1)(恆定時間)。類似地,線性搜索操作 的最壞情況複雜度爲O(N * lg N),儘管通常邊界將更加緊密,依此類推。在一些實現中,插入或刪除操作 將典型地在陣列中的值的數量上是線性的,但在最壞的情況下明顯可以是O(N * 1/N)。 陣列內部對於表演沒有好處; 也就是說,訪問具有低 索引的值或者插入或刪除具有高索引的值或 任何值都不一定更快。
這些時間複雜性表明CFArray
(因此NSArray
)實際上可能爲一棵樹來實現(測試表明,它甚至可能多的基礎數據結構之間進行切換)。
類似地,對於CFDictionary
,給定的界限具有相當寬的範圍:
計算複雜
在字典中的值的訪問時間是保證在 最壞O(N),用於任何實現,當前和未來,但 往往是O(1)(恆定時間)。插入或刪除操作 通常也將是恆定時間,但在一些實現中最壞的情況是O(N * N)。通過密鑰 訪問值比直接訪問值更快(如果有任何這樣的 操作)。與具有相同數量值的數組相比,字典傾向於使用更多的內存 。
我沒能找到的核心基礎標題爲CFSet
了類似的評論,但是源代碼的檢查表明,它是基於CFBasicHash
,這是一個哈希表,所以時間複雜度將是典型的對於散列表 - O(1)插入,刪除和測試通常,並在最壞的情況下O(n)。
如果您真的有興趣瞭解這些數據結構究竟如何工作,Core Foundation是開源的,因此您可以閱讀Apple's website上的源代碼。
- 1. 通過迭代的NSSet
- 2. NSSet的迭代順序是什麼?
- 3. R通過數據幀進行迭代的結果是什麼?
- 4. 通過xmltextreader進行迭代
- 5. 替代大O符號?
- 6. 這將落在什麼大O符號?
- 7. 什麼是變量'C'是指大O或歐米茄符號
- 8. 大O符號和遞歸
- 9. 大O符號和漸近
- 10. 爲什麼TreeSet迭代O(n)而不是O(n * logn)?
- 11. 大O符號中變量的垂直條是什麼意思?
- 12. 如何通過Python中的已排序迭代進行迭代
- 13. 迭代通過大熊貓行有效
- 14. 通過Outlook預約進行迭代
- 15. 通過選擇選項進行迭代
- 16. 通過嵌套列表進行迭代
- 17. 通過列表進行迭代
- 18. 通過嵌套列表進行迭代
- 19. 通過AJAX響應進行迭代
- 20. 通過臨時表進行迭代
- 21. 通過USB驅動器進行迭代
- 22. 通過多個div ID進行迭代
- 23. 爲什麼迭代HashMap O(c/n)?
- 24. 通過點符號訪問NSDictionary?
- 25. 什麼是執行時間增長率此代碼的大O?
- 26. NSSet問題(刪除對象和迭代)
- 27. 什麼時候通常喜歡小O而不是大O?
- 28. 爲什麼通過陣列大小迭代更快
- 29. 算法的大O符號
- 30. 迭代通過字符串?
如果您關心性能,請確保使用「快速枚舉」或塊。不要使用常規的C'for'或'while'循環。 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Collections/Articles/Enumerators.html – 2014-10-05 09:34:50
這個問題更多的是好奇心話題,而不是我看到的實際問題 – YogevSitton 2014-10-05 12:04:27
。那麼,答案取決於集合中的內容。 NSSet不是一個簡單的類,如果實現有幾萬行代碼,我不會感到驚訝。對於初學者來說,甚至沒有一個名爲「NSSet」的真正課程。這只是一個名稱,用於連接所有進入集合的實際類,實際使用的類將根據集的內容和代碼訪問集的模式而改變。一般來說,一套5件商品與50件商品相比,會有很大不同的表現特徵。是的,它可以處理那麼多的數據。 – 2014-10-06 01:23:13