簡體   English   中英

Java的int數組的高性能集合之類的數據結構

[英]High performing set like data structure for array of ints for java

我正在尋找一種表現像集合的高性能數據結構,並且其中的元素始終是整數數組。 數據結構僅需要滿足以下接口:

trait SetX {
  def size:Int
  def add(element:Array[Int])
  def toArray:Array[Array[Int]]
}

該集合不應包含重復項,這可以使用Arrays.equals(int [] a,int [] a2)來實現-即,數組的值不能相同。

在創建它之前,我對將要包含多少個元素有一個大概的了解,但是需要調整行為的大小以防萬一超出最初的想法。 元素的長度將始終相同,我知道創建時的長度。

當然,我可以使用Java HashSet(當然,也可以包裝數組),但這在緊密循環中使用,而且速度太慢。 我看過Trove,它的效果很好(通過使用數組但提供了TObjectHashingStrategy),但是我希望由於我的要求如此具體,因此可能會有一種更快/更有效的方法。

有沒有人遇到過這個問題,或者有一個想法我該如何完成?

上面的特征是Scala,但是我對Java庫或代碼感到非常滿意。


我真的應該說我在做什么。 我基本上是在一個緊密的循環中生成大量的int數組,最后,我只想看一看唯一的數組。 我永遠不必從集合或其他任何元素中刪除元素。 只需向集合中添加許多int數組,最后獲得唯一的數組。

前綴樹 您可以在數組生成期間立即遵循樹結構。 如果生成的數組已存在於集合中,則在生成結束時您將得到一個答案。 前綴樹將比普通哈希集消耗更少的內存。

如果您要生成數組,並且它們具有同等概率的機會很小,我懷疑您只是在非常有限的范圍內獲取數字。 它也會簡化前綴樹的實現。

我確信正確的實現將比使用任何設置的實現來保持固態數組更快。

該解決方案的缺點是您需要自己實現數據結構,因為它將與代碼邏輯深入集成。

在不知道有多少數據的情況下,或者如果您進行的讀取多於寫入:

您可能應該嘗試(即基准測試)數組數組或特殊包裝數組的數組(即具有數組和數組的緩存哈希碼的復合對象)的簡單情況。 通常,在較小的數據集上,遍歷數組的節奏不多(例如,用於Enum的HashMap實際上比遍歷慢)。

如果您確實有大量數據,並且願意做出一些讓步,則可以考慮使用布隆過濾器,但聽起來好像您沒有太多數據。

如果您想要高性能,請編寫自己的:

將其稱為ArraySetInt。

集通常實現為樹或哈希表。

如果您想要一個基於數組的集合,這會減慢添加(可能是刪除)的速度,但會加快迭代速度,降低內存使用率。 等等

首先看一下ArrayList是如何實現的。 刪除對象,並將其替換為原始int。

然后將add()重命名為put()並通過插入將其更改為排序類型。 使用System.arraycopy()進行插入。 使用Arrays.binsearch()查找插入位置以及一步是否已存在元素。

我將尋求一些經典的解決方案,通過提供更快的equalshashCode的類包裝數組。 hashCode可以簡單地進行緩存,並且equals可以利用它來快速地在數組不同的情況下拒絕。

我會避免Arrays.hashCode因為它使用愚蠢的乘法器(31),這可能會導致不必要的沖突。 對於真正快速的equals您可以使用密碼學,並說當且僅當兩個數組的SHA-1相等時,兩個數組才相等(您將是第一個發現沖突的人:D)。

ArrayWrapper非常簡單,應該比使用TObjectHashingStrategy更快,因為它TObjectHashingStrategy查看數據本身(更少的高速緩存未命中),並且具有最快,最好的hashCodeequals

您還可以尋找一些CompactHashSet實現,因為由於內存位置更好,它可以更快。

暫無
暫無

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

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