Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 从邻接矩阵求上n条加权边_Java_Graph_Adjacency Matrix - Fatal编程技术网

Java 从邻接矩阵求上n条加权边

Java 从邻接矩阵求上n条加权边,java,graph,adjacency-matrix,Java,Graph,Adjacency Matrix,我被图和邻接矩阵弄糊涂了。我有一个包含大量节点和边(例如5000个顶点和6000条边)的图。我必须对不相邻的每对节点进行评分(使用jaccard算法)。我使用gephi java文档。我使用jaccard对每对节点进行评分。如何在最快的时间内从邻接矩阵中找到前n个边分数 编辑 ArrayList<ArrayList<Double>> score = new ArrayList<ArrayList<Double>>(); Node[] n

我被图和邻接矩阵弄糊涂了。我有一个包含大量节点和边(例如5000个顶点和6000条边)的图。我必须对不相邻的每对节点进行评分(使用jaccard算法)。我使用gephi java文档。我使用jaccard对每对节点进行评分。如何在最快的时间内从邻接矩阵中找到前n个边分数

编辑

  ArrayList<ArrayList<Double>> score = new ArrayList<ArrayList<Double>>();
    Node[] nodes = graph.getNodes().toArray();
    Jaccard jaccard= new Jaccard();

    for(Node f:nodes){
        for(Node g:nodes){
            if(!graph.isAdjacent(g, f) && g!=f ){
                score.get(f.getId()).set(g.getId(), jaccard.getScore(f, g));
            }else {
                score.get(f.getId()).set(g.getId(), 0.0);
            }
        }
    }
ArrayList得分=新建ArrayList();
节点[]节点=graph.getNodes().toArray();
Jaccard Jaccard=新的Jaccard();
用于(节点f:节点){
用于(节点g:节点){
如果(!graph.isAdjacent(g,f)&&g!=f){
score.get(f.getId()).set(g.getId(),jaccard.getScore(f,g));
}否则{
score.get(f.getId()).set(g.getId(),0.0);
}
}
}
您需要一个优先级队列

算法:将PQ的容量设置为n。根据您定义的比较器(即,根据您提供的分数比较边的位置),不断向其添加对象(添加边,也就是说,这也应该说明节点)。继续盲目插入边,直到插入n个边为止。当您达到容量n时,在插入之前进行比较(peek()),您会发现可比较的对象始终位于PQ的顶部,因此比较的成本是一个很好的O(1)。如果新对象的分数较大,则执行连续poll()和add()操作;否则继续,直到比较所有边


完成后,PQ将具有前n个加权边。在这里学习。

当谈到排序时,总是一个您打算多久排序一次与您打算多久访问一次排序值的问题。邻接矩阵执行查找的速度可能非常慢,因此,如果在更适合排序和快速访问值的不同数据结构中表示成对节点和分数,则排序和访问值的速度可能会更快。我会尝试想出一种方法来存储边缘分数,并在某种集合中引用邻接矩阵中的条目,并为该集合寻找一种有效的排序算法。由于您使用的是相当大的数据集,我想到了PriorityQueue,但可能还有其他算法更适合您的需要,可以找到一个使用优先级队列在固定时间内对大型数据集进行排序的示例。对集合进行排序后,您可以从集合中获取顶部的“n”值,并检索对邻接矩阵中那些条目的引用,这些条目可用于绘制图形或其他操作

注意:邻接矩阵除了查找时间慢外,数据存储的内存成本也很高,因此这种可能的解决方案可能会对您的性能产生其他影响,最终取决于您将如何使用数据

编辑:

好的,为了回应您的评论,假设您的矩阵名为A,并且您插入的对节点是
A[i][j]
,那么您可以使用Entry作为设置为键值的对象。当你看着

PriorityQueue < Entry < K, V>>
PriorityQueue>
您将要插入的“K”(键值)是另一个条目对象,可以认为类似于

PriorityQueue < Entry < Entry < Integer,Integer>, V>>
PriorityQueue,V>>
因此,当您调用add时,您将(新条目(i,j),edgeScore)插入到队列中。 这有意义吗

编辑:


为了解决您的第二个问题,正如我在下面所述,邻接矩阵理论上是一个2D(nxn)布尔数组。它们不是内存效率最高的,访问速度也可能非常慢,但在适当的情况下会有一些用处。有关更详细的实现细节,您可以查看这篇文章,它显示了一种非常基本的实现方法,应该可以帮助您开始。您也可以尝试查看其他人推荐的替代方案和提高实现性能的方法,但本质上我认为利用优先级队列的最佳方法是在将值插入nxn布尔矩阵时构建队列,这将避免迭代矩阵本身,并使您能够利用优先级队列的排序能力,如果您在之后添加更多节点,还可以继续添加到优先级队列,它将负责对它们进行排序

谢谢你,亚当。我弄糊涂了。我不知道如何将配对节点及其分数添加到映射中。我说的是,只给不相邻的配对节点打分。相邻对节点的得分=0。我应该使用哈希映射实现矩阵吗?然后使用PriorityQueue。我是java新手。现在请帮助我更清楚地了解您进入的是一个完全不同的问题。简言之,邻接矩阵是布尔值的nXn矩阵,构造函数如下所示,boolean[][]adjacenyMatrix=new boolean[n],其中n是节点数,我将用更多的信息进行最后编辑,但对于实现邻接矩阵,此论坛上已有详细答案的现有问题。当我将值插入我的nxn double Matrix时,我如何构建队列?在这个线程中,您的原始问题太离题了,您的原始问题已得到回答否?如果您需要有关实施问题的进一步帮助,请在本网站上搜索适用于您的问题的现有问题,如果不存在,请发布另一个问题并提出更具体的技术问题。另外,请在进一步的问题中发布更多细节,人们在不知道你在做什么和为什么的情况下很难给出好的答案。