【问题标题】:Efficient way to store weighted edges in Java?在Java中存储加权边缘的有效方法?
【发布时间】:2020-10-30 04:21:52
【问题描述】:

来自 Java 新手的请求。我知道这是一个幼稚的问题,但直到现在我还没有找到令人满意的解决方案。目前stackoverflow上的一些帖子要么是针对未加权的图,要么涉及复杂的图实现工作。

我有一组顶点,用整数 1、2、3、...标记,其中一些与无向加权边相连(权重也是整数)。我已经设法通过使用 HashSet 来存储这些顶点,这对我来说非常方便(添加、搜索、删除等)

但是,我很难使用 Java 中的内置数据结构来存储这些边。 一般来说,我只想要一个简单的内置数据结构来存储带有权重的边,这样我就可以快速搜索和选择链接到某个顶点的边。我有一些初步的幼稚想法。例如 ArrayList> & HashMap (认为后者不会按预期工作,我只想为边缘设置一对整数顶点(a, b)作为从数据结构中获取权重的输入)但是,它们显然使用起来效率低下。 我不想使用邻接矩阵,因为它的大小足以让我无法接受。

单纯使用Java内置的数据结构,这样的需求是否可行?如果是,你能告诉我该怎么做吗?如果没有,你能想出一个对上述工作很容易的图形实现吗?提前谢谢你。

【问题讨论】:

  • 我认为更好的方法是在使用类时表示图形及其组件。例如定义一个Node 类,它有两个属性:一个名称(字符串)和一个边列表。定义一个具有 2 个属性的 Edge 类:Node 和到它的距离 (int)。 Graph 将是 Nodes 的集合。查看示例here
  • @c0der 谢谢!但是,对于顶点标签,我只想使用整数(为方便起见,因为 mu 输入是整数)。当我在 Vertex 类中将所有 String 更改为 int 或 Integer 并想要创建像 Vertex v1 = new Vertex(1); 这样的顶点时,结果是 java.lang.NoSuchMethodError: Vertex.(I)V 或 java.lang.NoSuchMethodError: Vertex.(Ljava/lang/Integer;)V。如何解决这个问题?
  • 张贴minimal reproducible example 的代码。一个新帖子会更好,因为这是一个不同的问题。
  • @c0der 我所做的基本上是在你的代码类Vertex中,转私有String标签;私有 int 标签;将 public Vertex(String pageObject) 变为 public Vertex(int pageObject),将 String getLabel() 变为 int getLabel(),其他语句保持不变。然后当我尝试使用 Vertex v1 = new Vertex(1); 创建一个顶点时在主函数中,我遇到了上面提到的错误。我认为启动一个新线程是不合适的,因为如果没有示例代码的上下文很难描述问题。
  • 请不要描述您的代码。发表它。 repl.it/@c0derrepo/LoneKeyTruetype#Main.java

标签: java graph hashmap undirected-graph weighted-graph


【解决方案1】:

老实说,我发现我想在 Java 中经常使用元组,但没有内置的元组类。我最终制作了自己的 - 它是简单的泛型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多