Java 图形数据结构
假设我有Java 图形数据结构,java,data-structures,graph,Java,Data Structures,Graph,假设我有MyClass{private LargeMatrix mtrx;hashCode(){…}} JGraphT(可能是所有图形数据结构)似乎正在使用哈希表映射顶点。那么,当我使用MyClass而不是字符串l1、l2、l3时,这会影响速度吗 在这种情况下有什么利弊?我应该重写hashcode(删除矩阵hashcode)吗?有没有使用引用而不是哈希表的图形 所以我的代码是: package ann; import org.jgrapht.DirectedGraph; import org.
MyClass{private LargeMatrix mtrx;hashCode(){…}}
JGraphT(可能是所有图形数据结构)似乎正在使用哈希表映射顶点。那么,当我使用MyClass而不是字符串l1、l2、l3
时,这会影响速度吗
在这种情况下有什么利弊?我应该重写hashcode(删除矩阵hashcode)吗?有没有使用引用而不是哈希表的图形
所以我的代码是:
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)
包ann;
导入org.jgrapht.DirectedGraph;
导入org.jgrapht.graph.DefaultEdge;
导入org.jgrapht.graph.SimpleDirectedGraph;
/**
*@作者marmoush
*
*/
公共班级网络
{
有向图;
字符串l1=“hello1”;
字符串l2=“hello1”;
字符串l3=“hello3”;
/**
*
*/
公共网络()
{
有向图=新的SimpleDirectedGraph(DefaultEdge.class);
有向图。添加顶点(l1);
有向图。添加顶点(l2);
有向图。添加顶点(l3);
有向图.加差(l1,l2);
System.out.println(有向图包含sedge(l1,l2));
//TODO自动生成的构造函数存根
}
}
线程“main”java.lang.IllegalArgumentException中出现异常:不允许循环
位于org.jgrapht.graph.AbstractBaseGraph.addEdge(未知源)
在ann.Network.(Network.java:28)
位于test.TestNetwork.main(TestNetwork.java:9)
因为(我认为)l1.hashCode()==l2.hashCode()
编辑:
矩阵有时可能是零,有时可能是一,它们会随着时间的推移而变化,所以我会尝试提出一些区分这些对象的方法,这似乎是一个愚蠢的解决方案。为什么图形不能通过向量中的位置选择顶点呢
我应该重新发明轮子吗?使用向量而不是哈希表的图形?还是有一个解决办法?嗯,这是有道理的,
您的objectl1与l2相同,即使它存储在内存中的不同位置,对于图形,它是相同的顶点
是否有需要在图形中创建相同顶点的原因?也许有一个解决办法字符串在Java中是不可变的,因此l1和l2保证指向内存中完全相同的位置。这是该语言的一个很好的特性,它大大加快了字符串处理速度,但在这种情况下它会把你搞砸 这就是为什么会出现循环异常。我想这里需要一个无向图结构 有关参考,请参阅Java语言规范:
- 同一包(§7)中同一类(§8)中的文字字符串
表示对相同内容的引用
字符串对象(§4.3.1)李> - 同一包中不同类中的文本字符串 表示对相同对象的引用 字符串对象李>
- 不同包中不同类中的文本字符串 同样表示对 相同的字符串对象
我将创建一个顶点类,并适当地实现
equals()
和hashcode()
。速度影响并不是很大,如果顶点的id是数字,速度甚至会更快。问题是这种图形不允许循环。您必须将图形类型更改为AbstractBaseGraph
,您可以将变量loopAllowed
设置为true
,或者您可以尝试在SimpleDirectedGraph
中更改此变量
问题:我无法更改SimpleDirectedGraph
中的变量,但您可以使用其他类型的图形来执行此操作
希望我能帮助您。有时这些矩阵可能是零,并且它们会随着时间的推移而变化。所以我不会允许通过hashcodel1选择它,l2永远不会存储在内存中的不同位置。请看我上面的答案。正如澄清的那样,l1和l2保证指向内存中完全相同的位置,因为它们都是用字符串文本初始化的。如果l2初始化为
String l2=new String(“hello1”)
,则l1==l2
将为false。哈希表结果仍然相同,引发异常。我的问题不是字符串,而是哈希表用作索引器,我想使用列表或Vector@Soronthar-正确。谢谢你的澄清。今天我学到了一些新东西。@ismail marmoush-我不熟悉JGraphT框架,所以我不能确定是否可以使用列表或向量,尽管它应该可以工作。哈希表应该将两个相同的字符串散列到相同的位置,而列表可能不会这样做。不要使用Vector类——它会同步每个方法,并会不必要地降低代码的速度。向量类是一个遗留的遗迹,已经存在了十多年了。