当前位置: 首页 > 面试题库 >

Java-哪个是Graph的最佳实现结构?

居飞扬
2023-03-14
问题内容

该图非常大,但无向。边缘未加权。

在我的实现中,我必须找到最大度数的顶点,并在顶点和边上都删除。

链表?数组列表?地图?

哪种对我的实施更好?


问题答案:

我的建议是将顶点存储在优先级队列中。这样,您可以非常快速地访问最高度的顶点。至于如何实现顶点,我将每个相邻的顶点存储在某种形式的数据结构中,例如HashSet或TreeSet,以便能够有效地删除内容。我不会明确地表示边缘,这不是必需的。

代码,类似于以下内容:

class Graph {

  PriorityQueue<Vertex> vertexes;

  public Graph() {
    vertexes = new PriorityQueue<Vertex>(10,new Vertex());
  }

  public Vertex maxDegreeVertex() {
    return vertexes.peek();
  }

  ...

}

class Vertex implements Comparator<Vertex> {
  HashSet<Vertex> edges;

  public Vertex() {
    edges = new HashSet<Vertex>();
  }

  public compare(Vertex v1, Vertex v2) {
    v2.edges.size().compareTo(v1.edges.size());
  }

  ...

}

希望这可以帮助。



 类似资料:
  • 问题内容: 在循环中声明变量是好的还是在Java中动态声明最佳。在循环中声明时是否还涉及性能成本? 例如。 选项1:循环外 选项2:循环内 问题答案: Robert C. Martin 在CleanCode中建议Java编码人员声明变量,使其尽可能接近使用它们的位置。变量的作用域不应超出必需的范围。使变量的声明靠近使用它的位置有助于提供读者类型和初始化信息。不要对性能太在意,因为JVM非常擅长优化

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我利用了以下JPA实现: hibernate 顶联 OpenJPA 他们每个人都有自己的优点和缺点。我发现Hibernate是这三个中最先进的,除了它将自己的某

  • 问题内容: 我(使用Java)正在研究一种递归图像处理算法,该算法以递归方式从中心点向外遍历图像的像素。 不幸的是,这会导致堆栈溢出。因此,我决定切换到基于队列的算法。 现在,这一切都很好而且很花哨- 但考虑到以下事实:它的队列将在非常短的时间内分析成千上万个像素,同时不断弹出并推动,而不会保持可预测的状态(长度可能在100到100之间,和20000),则队列实现需要具有显着的快速弹出和推送功能。

  • 修改器和填充函数可以做的事,纯函数也可以做到。实际上有些所谓的函数式编程语言只支持纯函数。一些程序员认为,比起使用修改器来,使用纯函数开发程序更快且更不易出错。但是,有很多时候修改器是很方便的,也有很多情况下函数是程序效率是更低的。 总而言之,我推荐在能使用纯函数的时候尽量编写纯函数,在修改器有无法比拟的优势的情况下,再求助于修改器。此方法可称为函数式编程风格。

  • 我正在(用Java)研究递归图像处理算法,该算法从中心点向外递归遍历图像的像素。 不幸的是,这会导致堆栈溢出。所以我决定切换到基于队列的算法。 现在,这一切都很好,但是考虑到它的队列将在很短的时间内分析数千个像素,同时不断弹出和推送,而不保持可预测的状态(长度可能在100到20000之间),队列实现需要具有显著的快速弹出和推送能力。 链表似乎很有吸引力,因为它能够将元素推到自己身上,而无需重新排列

  • 问题内容: 我目前正在一个项目中,该项目需要保留任何类型的对象(我们没有任何控制权的实现),以便以后可以恢复这些对象。 我们无法实现ORM,因为我们不能在开发时限制我们库的用户。 我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改的类型,名称等)时,恢复对象存在很多麻烦。 我们尝试使用XMLEncoder类(将对象转换为XML),但是发现缺少功能