[英]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中。
謝謝!
如果把它弄成碎片,在我看來
你這樣做n次,這給你O(n)。 這已經是最佳選擇,因為無論如何您必須觸摸一次每個元素:)
根據隨機數的范圍,您可能會遇到問題。 例如,假設您只生成一個和一個之間的數字,那么顯然只有一個可能的結果(“ 1-1-1-1-1-1”),並且從那以后您將只有碰撞。 但是,只要可能的序列數比生成的元素數大得多,我就不會出現問題。
提示:如果您事先知道生成的元素數,則用正確的元素數初始化哈希集是明智的(即new HashSet<String>( 100000 ) );
ps現在出現了其他答案,我想指出的是,盡管在微觀層面上可能還有改進的余地(即使用特定於語言的技巧),但您的總體方法無法改善。
這樣,您將避免對集進行排序和轉換/格式化。
只需對每個集合使用java.util.BitSet ,並使用set(int bitIndex)方法向集合中添加整數,則無需進行任何排序,並在向其添加新的BitSet之前檢查HashMap中是否已存在BitSet。 ,這真的會非常快。 如果速度很重要,則不要為此目的使用值和toString的排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.