在這個特殊的例子中,它並沒有太多的關於算法,它是關於數據結構:Multiset
就像Set
,除了它不僅存儲唯一的項目,而且它存儲每個項目的頻率在Multiset
。基本上,Set
告訴你一個特定的項目是否在Set
在所有,另外一個Multiset
還告訴您多久該特定產品在Multiset
。
所以,基本上所有你需要做的就是從Array
構建一個Multiset
。這裏有一個Ruby的例子:
require 'multiset'
print Multiset[1,1,3,0,5,1,5]
是的,就是這樣。這將打印:
#3 1
#1 3
#1 0
#2 5
如果你只是想實際副本,您只需delete
與計數的項目少於2
:
print Multiset[1,1,3,0,5,1,5].delete_with {|item, count| count < 2 }
這只是打印
#1 3
#2 5
由於@suihock提到,您也可以使用Map
,這基本上意味着代替Multiset
負責元素計數你,你要自己做:
m = [1,1,3,0,5,1,5].reduce(Hash.new(0)) {|map, item| map.tap { map[item] += 1 }}
print m
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
同樣,如果你只希望重複:
print m.select {|item, count| count > 1 }
# { 1 => 3, 5 => 2 }
但你可以有一個更容易,如果不是自己的計算,可以使用Enumerable#group_by
到組元素,然後將這些分組映射到它們的大小。最後,轉換回Hash
:
print Hash[[1,1,3,0,5,1,5].group_by(&->x{x}).map {|n, ns| [n, ns.size] }]
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
所有這些都Θ(N)的攤銷最壞情況下的步驟的複雜性。
謝謝所以你的算法將是O(n)? – user472221 2010-11-20 08:10:08
是的,它只是一個循環。 – Emil 2010-11-20 08:23:35
在此先感謝 – user472221 2010-11-20 19:03:01