我正在開發具有以下屬性的 Ruby 演算法:
- 它適用于兩個 Set 型別的物件,其中每個元素都是一個 Array,其中所有元素都是 String 型別
- 涉及的每個 Array 具有相同數量的元素
- 沒有兩個陣列恰好具有相同的內容(與 比較時
==) - 該演算法涉及將陣列從一個集合移動到另一個(或回傳)、存盤對某些陣列的參考以及測驗該參考是否是陣列的一部分的許多操作
- 陣列沒有重復;所有陣列始終保持其物件 ID。
本機實作會做這樣的事情(給你的想法);實際上,這里的陣列有更長的字串和更多的元素:
# Set up all Arrays involved
master=[
%w(a b c d),
%w(a b c x),
%w(u v w y),
# .... and so on
]
# Create initial sets.
x=Set.new
y=Set.new
# ....
x.add(master[0])
x.add(master[2])
y.add(master[1])
# ....
# Operating on the sets.
i=1
# ...
arr=master[i]
# Move element arr from y to x, if it is in y
if(y.member?(arr)
y.delete(arr)
x.add(arr)
end
# Do something with the sets
x.each { |arr| puts arr.pretty_print }
這確實可行,只是因為陣列的內容都不同。但是,成員資格測驗意味著y.member?(arr)測驗我們還沒有像arr我們的 Set 中那樣具有相同陣列內容的物件,而驗證我們沒有具有相同 object_id 的元素就足夠了我們的套裝,所以我擔心性能。據我了解,查找物件的物件 id 很便宜,而且由于它只是一個數字,因此維護一組數字比維護一組字串陣列更高效。
因此,我可以嘗試將我的兩個集合定義為 object_id 集合,并且成員資格測驗會更快。但是,在迭代 Set 時,使用 object_id 查找陣列本身很昂貴(我必須搜索ObjectSpace)。
另一種可能性是不維護陣列集,而是將索引集保存到我的主陣列中。我的代碼將是,例如,
x.add(0) # instead of x.add(master[0])
并迭代一個 Set 將是,即
x.each { |i| puts master[i].pretty_print }
我想知道是否有更好的方法 - 例如,我們可以以某種方式“教” Set.new 使用物件身份來維護其成員,而不是平等。
uj5u.com熱心網友回復:
我認為您正在尋找Set#compare_by_identity,這使得集合使用其內容的物件標識(即物件 ID)。
x = Set.new
x.compare_by_identity
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460556.html
標籤:红宝石
