图数据结构

时间:2011-03-23 13:50:16

标签: java data-structures graph

让我说我有MyClass{ private LargeMatrix mtrx; hashCode(){...}}

JGraphT(可能所有的Graph数据结构)似乎都在使用Hash表来映射顶点。那么当我使用MyClass而不是String l1,l2,l3时会影响速度吗?

在这种情况下有哪些优点和缺点?我应该覆盖哈希码(删除矩阵哈希码)吗?是否有使用引用而不是哈希表的图形?

所以我的代码是:

package ann;

import org.jgrapht.DirectedGraph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleDirectedGraph;

/**
 * @author marmoush
 * 
 */
public class Network
{
    DirectedGraph<String, DefaultEdge>  diGraph;
    String l1="hello1";
    String l2="hello1";
    String l3="hello3";
    /**
     * 
     */
    public Network()
    {

        diGraph = new SimpleDirectedGraph<String, DefaultEdge>(DefaultEdge.class);
        diGraph.addVertex(l1);
        diGraph.addVertex(l2);
        diGraph.addVertex(l3);

        diGraph.addEdge(l1, l2);
        System.out.println(diGraph.containsEdge(l1,l2));
        // TODO Auto-generated constructor stub
    }

}


Exception in thread "main" java.lang.IllegalArgumentException: loops not allowed
    at org.jgrapht.graph.AbstractBaseGraph.addEdge(Unknown Source)
    at ann.Network.<init>(Network.java:28)
    at test.TestNetwork.main(TestNetwork.java:9)

因为(我认为)l1.hashCode()==l2.hashCode()

修改 矩阵有时可能是零或者是矩阵,它们会随着时间的推移而变化,因此我会尝试提出区分这些对象的东西,这似乎是愚蠢的解决方案。为什么图形不能仅通过向量中的位置选择顶点?

我应该重新发明轮子吗?使用向量而不是哈希表的图形?还是有工作?

4 个答案:

答案 0 :(得分:2)

我会创建一个Vertex类并适当地实现equals()hashcode()。速度影响不是很大,如果顶点的id是数字,它甚至可以更快。

答案 1 :(得分:0)

它确实有意义, 你的objectl1与l2相同,即使它存储在不同位置的内存中,对于图形它也是同一个顶点。

有没有理由说你需要在图中使用相同的顶点?也许有一个解决方法

答案 2 :(得分:0)

字符串在Java中是不可变的,因此l1和l2保证指向内存中完全相同的位置。这是该语言的一个很好的功能,它加快了字符串处理速度,但它会在这种情况下搞砸你。

这就是你得到循环异常的原因。我怀疑你想要一个无向图形结构。

有关参考,请参阅Java语言规范section 3.10.5

  
      
  • 同一个包中的同一个类(第8节)中的文字字符串(第7节)   表示对相同的参考   字符串对象(第4.3.1节)。
  •   
  • 同一个包中不同类中的文字字符串   代表对它的引用   字符串对象。
  •   
  • 不同包中不同类中的文字字符串   同样代表参考   相同的String对象。
  •   

答案 3 :(得分:0)

问题是这种图形不允许循环。您必须将图表的类型更改为AbstractBaseGraph,您可以将变量loopAllowed设置为true,或者您可以尝试在SimpleDirectedGraph中更改此变量。

问题:我无法更改SimpleDirectedGraph中的变量,但您可以使用其他类型的图表来执行此操作。

我希望我能帮到你。