我正在做一个用Java编写的项目,它需要我构建一个非常大的2-D稀疏数组。非常稀疏,如果这有区别的话。无论如何:这个应用程序最关键的方面是时间效率(假设内存负载很大,尽管不是无限的,以至于我可以使用标准的2-D数组--键的范围在两个维度上都有数十亿)。
在数组中的kajillion单元之外,将有数十万个单元包含一个对象。我需要能够修改单元格的内容非常快。
不管怎样:有没有人知道有什么特别好的库可以做到这一点?它必须是Berkeley,LGPL或类似的许可证(没有GPL,因为产品不能完全开源)。或者,如果只有一个非常简单的方法来制作一个自制的稀疏数组对象,那也是可以的。
我正在考虑MTJ,但还没有听到任何关于它的质量的意见。
发布于 2011-02-04 17:04:42
下面是测试Java Matrix Libraries的框架,还提供了这些!https://lessthanoptimal.github.io/Java-Matrix-Benchmark/的一个很好的列表
已测试的库:
* Colt
* Commons Math
* Efficient Java Matrix Library (EJML)
* Jama
* jblas
* JScience (Older benchmarks only)
* Matrix Toolkit Java (MTJ)
* OjAlgo
* Parallel Colt
* Universal Java Matrix Package (UJMP)
发布于 2008-12-24 09:46:59
这似乎很简单。
您可以使用row*maxcolums+column作为索引来使用数据的二叉树。
要查找项,您只需计算row*maxcolums+column并在树中查找它,如果不存在,则可以返回null (它是О(log ),其中n是包含对象的单元格的数量)。
发布于 2008-12-24 10:51:59
可能不是最快的运行时解决方案,但我能想到的最快的运行时解决方案似乎是有效的。创建索引类并将其用作SortedMap的键,如下所示:
SortedMap<Index, Object> entries = new TreeMap<Index, Object>();
entries.put(new Index(1, 4), "1-4");
entries.put(new Index(5555555555l, 767777777777l), "5555555555l-767777777777l");
System.out.println(entries.size());
System.out.println(entries.get(new Index(1, 4)));
System.out.println(entries.get(new Index(5555555555l, 767777777777l)));
我的Index类看起来像这样(在Eclipse代码生成器的帮助下)。
public static class Index implements Comparable<Index>
{
private long x;
private long y;
public Index(long x, long y)
{
super();
this.x = x;
this.y = y;
}
public int compareTo(Index index)
{
long ix = index.x;
if (ix == x)
{
long iy = index.y;
if (iy == y)
{
return 0;
}
else if (iy < y)
{
return -1;
}
else
{
return 1;
}
}
else if (ix < x)
{
return -1;
}
else
{
return 1;
}
}
public int hashCode()
{
final int PRIME = 31;
int result = 1;
result = PRIME * result + (int) (x ^ (x >>> 32));
result = PRIME * result + (int) (y ^ (y >>> 32));
return result;
}
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Index other = (Index) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
public long getX()
{
return x;
}
public long getY()
{
return y;
}
}
https://stackoverflow.com/questions/390181
复制相似问题