簡體   English   中英

存儲整數集以檢查是否已提及某個特定的集

[英]storing sets of integers to check if a certain set has already been mentioned

我遇到了一個有趣的問題,我希望得到一些投入。

我有一個生成一組數字的程序(基於一些預定義的條件)。 每個集合最多包含6個數字,這些數字不一定是唯一的,整數范圍是1到100。

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

在這種情況下,速度是優先事項,因為在程序停止之前可能會存儲多達10萬個數據集(可能更多,但大多數時候可能更少)! 關於我應該使用哪種數據結構以及如何解決此問題,有人會提出任何建議嗎?

我目前所擁有的是:

在將每個集合存儲到字符串HashSet中之前對其進行排序。 字符串只是排序集中帶有分隔符的每個數字。

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

謝謝!

如果把它弄成碎片,在我看來

  • 在O(1)中運行一個創建集合(生成6個數字,進行排序,字符串化)
  • 檢查此字符串是否在哈希集中是否為O(1)
  • 插入哈希集的是O(1)

你這樣做n次,這給你O(n)。 這已經是最佳選擇,因為無論如何您必須觸摸一次每個元素:)

根據隨機數的范圍,您可能會遇到問題。 例如,假設您只生成一個和一個之間的數字,那么顯然只有一個可能的結果(“ 1-1-1-1-1-1”),並且從那以后您將只有碰撞。 但是,只要可能的序列數比生成的元素數大得多,我就不會出現問題。

提示:如果您事先知道生成的元素數,則用正確的元素數初始化哈希集是明智的(即new HashSet<String>( 100000 ) );

ps現在出現了其他答案,我想指出的是,盡管在微觀層面上可能還有改進的余地(即使用特定於語言的技巧),但您的總體方法無法改善。

  1. 創建一個類SetOfIntegers
  2. 實現hashCode()方法,該方法將生成合理的唯一哈希值
  3. 使用HashMap存儲諸如put(hashValue,instance)之類的元素
  4. 使用containsKey(hashValue)檢查是否已經存在相同的hashValue

這樣,您將避免對集進行排序和轉換/格式化。

只需對每個集合使用java.util.BitSet ,並使用set(int bitIndex)方法向集合中添加整數,則無需進行任何排序,並在向其添加新的BitSet之前檢查HashMap中是否已存在BitSet。 ,這真的會非常快。 如果速度很重要,則不要為此目的使用值和toString的排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM