Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于java的Int数组的高性能类似集合的数据结构_Java_Performance_Scala - Fatal编程技术网

用于java的Int数组的高性能类似集合的数据结构

用于java的Int数组的高性能类似集合的数据结构,java,performance,scala,Java,Performance,Scala,我正在寻找一个高性能的数据结构,它的行为类似于一个集合,其中的元素总是一个int数组。数据结构只需满足此接口: trait SetX { def size:Int def add(element:Array[Int]) def toArray:Array[Array[Int]] } 集合不应包含重复项,这可以通过使用Arrays.equals(int[]a,int[]a2)实现,即数组的值不能相同 在创建它之前,我大致知道将有多少元素,但需要调整行为大小,以防有比最初想象的更多的元

我正在寻找一个高性能的数据结构,它的行为类似于一个集合,其中的元素总是一个int数组。数据结构只需满足此接口:

trait SetX {
  def size:Int
  def add(element:Array[Int])
  def toArray:Array[Array[Int]]
}
集合不应包含重复项,这可以通过使用Arrays.equals(int[]a,int[]a2)实现,即数组的值不能相同

在创建它之前,我大致知道将有多少元素,但需要调整行为大小,以防有比最初想象的更多的元素。元素的长度总是一样的,我知道在创作的时候是什么

当然,我可以使用Java哈希集(当然是包装数组),但这是在一个紧密的循环中使用的,而且速度太慢。我看过Trove,它运行得很好(通过使用数组但提供TObjectHashingStrategy),但我希望,因为我的需求非常具体,所以可能有一种更快/更有效的方法来实现这一点

有没有人遇到过这个问题,或者知道我如何才能做到这一点

上面的特性是Scala,但我对Javalibs或代码非常满意



我真的应该说我在做什么。我基本上是在一个紧循环中生成大量int数组,最后我只想看到唯一的数组。我从不需要从集合中删除元素或其他任何东西。只需向集合中添加大量int数组,并在最后取出唯一的数组。

不知道有多少数据,或者如果执行的是读多于写:

您可能应该尝试(ie基准测试)一个数组数组或特殊包装数组(即带有缓存的数组和数组哈希代码的复合对象)的简单情况。通常,在小数据集上,循环通过数组的次数不多(例如,枚举的HashMap实际上可能比循环通过数组慢)


如果你有大量的数据,你愿意做出一些妥协,你可能会考虑A,但是听起来你没有太多的数据。

< P>不知道有多少数据,或者你做了更多的阅读而不是写:

您可能应该尝试(ie基准测试)一个数组数组或特殊包装数组(即带有缓存的数组和数组哈希代码的复合对象)的简单情况。通常,在小数据集上,循环通过数组的次数不多(例如,枚举的HashMap实际上可能比循环通过数组慢)


如果你有大量的数据,你愿意做出一些妥协,你可能会考虑A,但是听起来好像你没有太多的数据。

< P>如果你想要高性能,那么写下你自己的:

称之为ArraySetInt

集合通常实现为树或哈希表

如果您想要一个基于数组的集合,这将降低添加(可能是删除)的速度,但会加快迭代,降低内存使用率。等等

首先看看ArrayList是如何实现的。 移除该对象并将其替换为原始int


然后将add()重命名为put(),并将其更改为按插入排序的类型。使用System.arraycopy()插入。使用Arrays.binsearch()一步查找插入位置以及元素是否已存在。

如果您想要高性能,请编写自己的:

称之为ArraySetInt

集合通常实现为树或哈希表

如果您想要一个基于数组的集合,这将降低添加(可能是删除)的速度,但会加快迭代,降低内存使用率。等等

首先看看ArrayList是如何实现的。 移除该对象并将其替换为原始int

然后将add()重命名为put(),并将其更改为按插入排序的类型。使用System.arraycopy()插入。使用Arrays.binsearch()一步查找插入位置以及元素是否已存在。

查看。您可以在数组生成过程中立即遵循树结构。在生成结束时,如果生成的数组已经存在于集合中,您将得到一个答案。前缀树将比普通哈希集消耗更少的内存

如果您正在生成数组,并且它们等价的可能性不是很小,那么我怀疑您只是从非常有限的范围中获取数字。它还将简化前缀树的实现

我确信正确的实现比使用任何集合实现来保持稳定的阵列都要快

这种解决方案的缺点是,您需要自己实现数据结构,因为它将与代码逻辑深度集成

看看。您可以在数组生成过程中立即遵循树结构。在生成结束时,如果生成的数组已经存在于集合中,您将得到一个答案。前缀树将比普通哈希集消耗更少的内存

如果您正在生成数组,并且它们等价的可能性不是很小,那么我怀疑您只是从非常有限的范围中获取数字。它还将简化前缀树的实现

我确信正确的实现比使用任何集合实现来保持稳定的阵列都要快


这种解决方案的缺点是,您需要自己实现数据结构,因为它将与代码逻辑深度集成

我会选择一些经典的解决方案,通过提供更快的
equals
hashCode
的类来包装数组。可以简单地缓存
hashCode
,并且
equals
可以利用它在不同数组的情况下快速说不

我会避免使用
数组。hashCode
,因为它使用了一个愚蠢的乘数(31),这可能会导致不必要的冲突。对于一个真正快速的
equals
,你可以利用密码学,当且仅当两个数组相等时才说它们相等(你会第一个发现冲突:d)

这个方法相当简单,应该比使用
TObjectHashingStrategy
更快,因为它不必查看