이렇게 뭔가가 필요했기 때문에 몇 가지 다른 접근법이 테스트되었습니다. 첫 번째 정수의 배열, 문자열의 다음 배열로, 10 만 반복에 대한
module Enumerable
def dups
inject({}) {|h,v| h[v]=h[v].to_i+1; h}.reject{|k,v| v==1}.keys
end
def only_duplicates
duplicates = []
self.each {|each| duplicates << each if self.count(each) > 1}
duplicates.uniq
end
def dups_ej
inject(Hash.new(0)) {|h,v| h[v] += 1; h}.reject{|k,v| v==1}.keys
end
def dedup
duplicates = self.dup
self.uniq.each { |v| duplicates[self.index(v)] = nil }
duplicates.compact.uniq
end
end
Benchark 결과 :이 모든 원본 배열에서 중복 된 항목의 배열을 반환합니다. 성능이 발견 중복의 numer에에 따라 달라질 수 있지만,이 테스트는 중복 고정 수 (~ 반 배열 항목이 중복입니다)에 있습니다
이러한 접근 방식 그래서, Enumerable.dedup 알고리즘이 보인다
test_benchmark_integer
user system total real
Enumerable.dups 2.560000 0.040000 2.600000 ( 2.596083)
Enumerable.only_duplicates 6.840000 0.020000 6.860000 ( 6.879830)
Enumerable.dups_ej 2.300000 0.030000 2.330000 ( 2.329113)
Enumerable.dedup 1.700000 0.020000 1.720000 ( 1.724220)
test_benchmark_strings
user system total real
Enumerable.dups 4.650000 0.030000 4.680000 ( 4.722301)
Enumerable.only_duplicates 47.060000 0.150000 47.210000 (47.478509)
Enumerable.dups_ej 4.060000 0.030000 4.090000 ( 4.123402)
Enumerable.dedup 3.290000 0.040000 3.330000 ( 3.334401)
..
Finished in 73.190988 seconds.
가장 : 원래 배열 DUP
- 는
- 가 UNIQ 어레이 요소마다 고유 요소
- 얻는다 불변하므로 다음 DUP 어레이를 선두 닐을
- 결과 압축하기
(array - array.uniq)가 올바르게 작동하면! (모든 것을 제거하지 않습니다.)
이 작업은 효과적이지만 큰 배열 (OP의 알고리즘과 동일한 순서)에 대해서는 매우 비효율적 인 'O (n^2) . 효율적인 대답은 –
에 대한 Jörg의 답변을 참조하십시오. 그러나 작은 배열의 경우 더 빠릅니다. – fl00r