回答
數組是Ruby的核心庫的一部分。每個Ruby實現都有自己的數組實現。 Ruby語言規範只規定了Ruby數組的行爲,它沒有指定任何特定的實現策略。它甚至沒有指定任何會強制或至少暗示特定實施策略的性能限制。
然而,大多數Ruby開發者有關於陣列,這將迫使不符合他們默默無聞到實現的性能特性的一些期望,因爲沒有人會真正使用它:
- 插入,前面加上或追加爲以及刪除元素爲O(n)的最壞情況下的步驟複雜和O的攤銷最壞情況下的步驟複雜度(1)
- 訪問一個元件爲O的最壞情況下的步驟複雜度(1 )
- 遍歷所有元素爲O(n的最壞情況下的步驟,複雜性)
這意味着陣列需要實現與指數調整大小動態數組,否則那些履約擔保無法得到滿足。你可能擺脫一個非常廣泛和淺的樹,但AFAIK沒有Ruby實現那樣做。
這裏的Rubinius's array implementation,這是我個人認爲最簡單的讀取所有Ruby實現的。 (注意:只有最基本的要素是用C++實現的,大多數數組方法都是用Ruby實現的,例如在kernel/common/array.rb
中)。
Set
和SortedSet
是stdlib中set
庫的一部分。 stdlib在Ruby實現之間大部分是共享的(至少實際上用Ruby編寫的部分,顯然是用其他語言編寫的部分不能共享),並且由於Set
是用Ruby編寫的,所以您可以期望它相同在所有Ruby實現上。
Set
是作爲Hash
實現的,其中僅使用密鑰,其值始終爲true
:請參閱Set#add
in lib/set.rb
。
SortedSet
由不Ruby實現紅黑樹的支持。
任何想法2維數組會發生什麼?是否將每個子數組實現爲它自己的數組? – EugeneMi 2014-11-05 22:07:23
Ruby中沒有多維數組,除非你正在討論stdlib中的'narray'庫? – 2014-11-05 22:21:39
上一個答案實際上並沒有涵蓋SortedSet的性能。
- 陣列 - O(1),用於添加,刪除和通過索引接入元件
- 哈希(使用哈希表) - O(1)(大當然1,大於陣列),用於添加,刪除,和通過關鍵
- 設置訪問 - 通過哈希所以同樣
- SortedSet的實現:
所以閱讀代碼,並使用其每計數比較方法調用類人工測試後,這裏的結果。 它試圖加載'rbtree'模塊並使用常規Set作爲後備。
所以2種選擇:
- RBTree可用,一切都快速,符合市場預期,對每一個除了O(logN)的,O(1)首先得到,O(N)上soeted_set.to_a。
- RBTree不可用。它使用Set(哈希底下)和重新排序如果閱讀髒。
從紅寶石2.0.0 set.rb:
def to_a
(@keys = @hash.keys).sort! unless @keys
@keys
end
含義在於以下代碼:
X.times{ sorted_set << num; sorted_set.first }
將O(XNlog(N)),由於訂貨是近似NLOG( N)。
因此,基本上使用SortedSet而不確定RBTree是否可用是令人困惑和低效的,因爲它沒有使用插入時排序(二進制搜索)的事實。 因此,在這種情況下使用普通的Set和數組方法可能會更快。使用常規設置
同例如:
X.times{ set << num; set.min }
將是O(XN)
底線,如果你需要SortedSet的工作效率,還可以添加 'rbtree' 到Gemfile中。
- 1. 紅寶石陣列
- 2. 紅寶石設置
- 3. 紅寶石陣建設
- 4. 如何使變換紅寶石陣列
- 5. 如何返回此紅寶石陣列
- 6. 紅寶石陣列範圍
- 7. 紅寶石陣列切片
- 8. 紅寶石陣列內部
- 9. 陣列中的紅寶石
- 10. 紅寶石陣列換行
- 11. 紅寶石發現陣列
- 12. 紅寶石陣列注入
- 13. 紅寶石陣列減法?
- 14. 兩個紅寶石陣列
- 15. 紅寶石:生成陣列
- 16. 紅寶石:從陣列
- 17. 紅寶石YAML陣列
- 18. 拼合紅寶石陣列
- 19. 紅寶石從陣列
- 20. 紅寶石嵌套陣列
- 21. 轉換陣列,紅寶石
- 22. 紅寶石:在陣列
- 23. 合併紅寶石陣列
- 24. 紅寶石 - 陣列弄平
- 25. 紅寶石陣列平等
- 26. 紅寶石陣列麻煩
- 27. 紅寶石陣列,[]操作
- 28. 紅寶石陣列打印
- 29. 紅寶石陣列值
- 30. 紅寶石塊到陣列
你可以看看源代碼,看看它是如何實現的。 – 2014-11-05 20:05:19