首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的稀疏矩阵/数组

Java中的稀疏矩阵/数组
EN

Stack Overflow用户
提问于 2008-12-23 21:55:14
回答 6查看 54.8K关注 0票数 72

我正在做一个用Java编写的项目,它需要我构建一个非常大的2-D稀疏数组。非常稀疏,如果这有区别的话。无论如何:这个应用程序最关键的方面是时间效率(假设内存负载很大,尽管不是无限的,以至于我可以使用标准的2-D数组--键的范围在两个维度上都有数十亿)。

在数组中的kajillion单元之外,将有数十万个单元包含一个对象。我需要能够修改单元格的内容非常快。

不管怎样:有没有人知道有什么特别好的库可以做到这一点?它必须是Berkeley,LGPL或类似的许可证(没有GPL,因为产品不能完全开源)。或者,如果只有一个非常简单的方法来制作一个自制的稀疏数组对象,那也是可以的。

我正在考虑MTJ,但还没有听到任何关于它的质量的意见。

EN

回答 6

Stack Overflow用户

发布于 2011-02-04 17:04:42

下面是测试Java Matrix Libraries的框架,还提供了这些!https://lessthanoptimal.github.io/Java-Matrix-Benchmark/的一个很好的列表

已测试的库:

代码语言:javascript
复制
* 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) 
票数 10
EN

Stack Overflow用户

发布于 2008-12-24 09:46:59

这似乎很简单。

您可以使用row*maxcolums+column作为索引来使用数据的二叉树。

要查找项,您只需计算row*maxcolums+column并在树中查找它,如果不存在,则可以返回null (它是О(log ),其中n是包含对象的单元格的数量)。

票数 4
EN

Stack Overflow用户

发布于 2008-12-24 10:51:59

可能不是最快的运行时解决方案,但我能想到的最快的运行时解决方案似乎是有效的。创建索引类并将其用作SortedMap的键,如下所示:

代码语言:javascript
复制
    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代码生成器的帮助下)。

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档