2012-07-14 191 views
1

我遇到了一個有趣的問題,我很想得到一些輸入。存儲整數集來檢查是否已經提到某個集合

我有一個程序,生成一組數字(基於一些預定義的條件)。每個集合最多包含6個數字,不必使用1到100之間的整數來唯一)。

我想以某種方式存儲每個創建的集合,以便我可以快速檢查某個集合是否具有完全相同的數字(順序無關緊要)先前已生成。

速度在這種情況下是一個優先事項,因爲在程序停止之前可能會存儲高達100k個集(可能更多,但大部分時間可能更少)!有人會對我應該使用什麼數據結構以及我應該如何處理這個問題有任何建議嗎?

什麼我現在是這樣的:

排序每組將其存儲到字符串的一個HashSet之前。該字符串簡單地說是每個有序分隔符集合中的數字。

例如,集合{4,23,67,67,71}將被編碼爲字符串「4-23-67-67-71」並存儲到HashSet中。然後對每個新生成的集合進行排序,編碼並檢查它是否存在於HashSet中。

謝謝!

+1

如果你有記憶,HashSet是一個不錯的選擇。 – Starkey 2012-07-14 14:27:40

+0

它可以包含重複項時不是一個集合。稱它爲multiset或包。 – 2012-07-14 14:48:51

+0

謝謝菲利普,我不確定它的正確術語是什麼。 – Mick 2012-07-14 14:54:43

回答

2

,如果你打破它成片,在我看來那

  • 創建一組(產生6號,排序,字符串化)運行在O(1)
  • 檢查,如果在HashSet中存在此字符串爲O(1)
  • 插入HashSet的是O(1)

你這樣做了N次,它給你爲O(n)。 這已經是最佳,你需要接觸每個元素一旦反正:)

威力碰上這取決於你的隨機數的範圍問題。 例如假設你只產生1到1之間的數字,那麼顯然只有一個可能的結果(「1-1-1-1-1-1」),你將只有碰撞。然而,只要可能的序列數量遠遠大於您生成的元素數量,我就不會看到問題。

一個提示:如果你知道生成的元素的數量事先將是明智與正確數量的元素(IE的new HashSet<String>(100000));

PS現在與其他答案雨後春筍般冒出來,我想初始化的HashSet請注意,儘管在微觀層面上可能有改進的空間(即使用語言特定的技巧),但您的整體方法無法改進。

+0

謝謝Kritz,很高興知道我在正確的軌道上。我一定會嘗試一下,看看它的表現如何。我最擔心的是排序,即使每組只有6個元素。 – Mick 2012-07-14 15:07:32

+0

好吧,它只有六個數字,所以它應該非常快。但如果這真是一個麻煩製造者,你可以看看這個stackoverflow問題:http://stackoverflow.com/questions/1866031/generating-sorted-random-ints-without-the-sort-on。 – kritzikratzi 2012-07-14 15:18:33

2
  1. 創建一個類SetOfIntegers
  2. 實施,將產生相當獨特的哈希一個hashCode()方法值
  3. 使用HashMap來存儲你的元素,如認沽(散列值,例如)
  4. 使用的containsKey(散列值)來檢查相同的哈希值是否已經存在

這樣你將避免排序和轉換/格式化你的設置。

+0

感謝Mazaneicha,我將研究一下hashCode(),我從來沒有真正重寫過這個函數。你會有任何提示來定義一個基於我的問題範圍的散列函數不會有衝突嗎? – Mick 2012-07-14 15:04:08

+0

一如既往,StackOverflow是你的朋友:)看看這篇文章http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java祝你好運! – mazaneicha 2012-07-14 15:10:47

+0

這是 - 非常好的資源,謝謝! – Mick 2012-07-14 15:16:19

2

只需使用每個集合的java.util.BitSet,使用set(int bitIndex)方法將整數添加到集合中,您無需對任何東西進行排序,並在爲其添加新的BitSet之前檢查HashMap是否已存在BitSet ,它會非常快。如果速度很重要,不要使用value和toString的排序。

+0

謝謝Christophe,這是一個非常有趣的解決方案。我快速瀏覽了BitSet的javadocs,我有一個問題。此方法是否可以解釋重複值?這似乎是獨特套裝的絕​​佳解決方案。 – Mick 2012-07-14 15:02:16

+0

是的,對不起,我完全錯過了「那不必是唯一的」部分(並沒有檢查重複67的樣本值),因此它不適用於您。然後使用'int []'數組,'java.util.Arrays.sort(array)'和'java.util.Arrays.equals(array1,array2)'靜態方法,這是下一個最快/最容易做的事情。 – 2012-07-14 17:07:12

相關問題