2014-06-18 51 views
0

我想分析一些文檔並在其中找到相似之處。經過分析,我有一個數組,其中的元素是來自被認爲相似的文件的數據數組。但有時我有兩個幾乎相似的元素,當然我想離開其中最大的元素。爲了簡化:移除數組數組中相似數組的有效方法

data = [[1,2,3,4,5,6], [7,8,9,10], [1,2,3,5,6]...] 

如何有效地處理我得到的數據:

data = [[1,2,3,4,5,6], [7,8,9,10]...] 

我想我可以相交每個數組,如果相交的陣列相匹配的原始陣列中的一個 - 我不理它。這是我寫的一個快速代碼:

data = [[1,2,3,4,5,6], [7,8,9,10], [1,2,3,5,6], [7,9,10]] 
cleaned = [] 

data.each_index do |i| 
    similar = false 
    data.each_index do |j| 
    if i == j 
     next 
    elsif data[i]&data[j] == data[i] 
     similar = true 
     break 
    end 
    end 
    unless similar 
    cleaned << data[i] 
    end 
end 

puts cleaned.inspect 

這是一種有效的方式嗎?此外,當前的行爲只允許離開了那幾個元素短數組,如果他們出現,我可能要合併相似矩陣:

[[1,2,3,4,5], [1,3,4,5,6]] => [[1,2,3,4,5,6]] 
+1

問題的最後一部分要求您定義「足夠類似於合併」 - 例如,在合併之前有多少元素(或它們的比例)需要匹配? –

+0

@NeilSlater,它還沒有想過它,並沒有分析太多的數據,看看這種情況發生的頻率。從一批文件中,我注意到兩個相似的數據陣列,它們有一個元素([same_stuff,x],[same_stuff,y])不同,我想這個差別可能會稍微大一些。 – Vilmar

+0

-1問題沒有明確定義。 – sawa

回答

1

可以刪除列表中的任何元素,如果它完全包含在另一個元素:

data.delete_if do |arr| 
    data.any? { |a2| !a2.equal?(arr) && arr - a2 == [] } 
end 
# => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10]] 

,因爲一旦你決定一個元素應刪除這比你的建議多一點效率,你不對證在未來的迭代。

+0

太好了,這確實是更高效。當我想合併一些元素時,我將不得不求助於其他的東西,我想 – Vilmar

+0

這將無法刪除重複數組 – sawa

+0

這只是部分幫助 – sawa

相關問題