Java Comparator的运行时复杂性是什么?

Java Comparator的运行时复杂性是什么?,java,sorting,comparator,Java,Sorting,Comparator,我有一个自定义对象,比如说Person.java,带有字段String name和int age。假设我有100个objectPerson的不同实例,我想用自定义比较器s.t.对其进行排序。最年长的人将排在最年轻的人之前。编写比较器本身很容易——只要实现compareTo方法,我就会将对象放入列表(或者队列会更好?)。但是,这个比较器方法的运行时是什么?执行自定义排序方法本身是否更快 我猜想您使用的是JDK8或类似产品 在大多数情况下,您只需要以下代码就可以以非常好的性能完成所描述的任务: Li

我有一个自定义对象,比如说
Person.java
,带有字段
String name
int age
。假设我有100个object
Person
的不同实例,我想用自定义比较器s.t.对其进行排序。最年长的人将排在最年轻的人之前。编写比较器本身很容易——只要实现compareTo方法,我就会将对象放入
列表
(或者
队列
会更好?)。但是,这个比较器方法的运行时是什么?执行自定义排序方法本身是否更快

我猜想您使用的是JDK8或类似产品

在大多数情况下,您只需要以下代码就可以以非常好的性能完成所描述的任务:

List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
// adding all elements
...
list.sort(comparator);
我们应该考虑2个部分:

  • O(n)xo(log(n))
    :与排序算法有关,如的文档中所述,在最坏的情况下,我们可以预期
    n*log(n)
    ,这就是为什么我使用大的
    O
    ,但是如果列表被部分排序,则运行时间接近
    n
  • C
    :与
    compareTo()
    实现的运行时间有关,正如您所提到的,您只是在比较它们的年龄,这很简单,不应该引起关注。因此,这个实现的运行时间应该是恒定的,即aka
    O(1)
    。(这可能是您的要求)
  • 如果第二点为真,则总运行时复杂性应表示为:

    O(n) x O(log(n))
    
    这个比较器方法的运行时是什么

    这取决于您如何实现它(!),但是,如果您只是比较相应对象中
    age
    和/或
    name
    字段的值,则它应该是
    O(1)

    排序算法的复杂性通常是根据它执行的比较次数来表示的。因此,如果选择的排序算法是
    O(NlogN)
    ,而您的
    比较器是
    O(1)
    ,我们可以预测1总体复杂度将是
    O(NlogN x1)
    O(NlogN)

    执行自定义排序方法本身是否更快

    不。如果实现自定义排序,肯定不会提高复杂性。(对于一般用途的单线程排序,不能比
    O(NlogN)
    做得更好。)

    • 如果您手动将比较代码“内联”到自定义排序中,您仍将执行相同的操作来比较字段,并且执行相同的次数

    • 更一般地说,Java8及更高版本中内置的
      sort(…)
      所使用的算法是最先进的算法。如果没有显著的成本(在开发工作和/或可维护性方面),您不可能对它们进行改进


    这个问题有点“不”的味道。请仔细阅读这意味着什么以及为什么这(通常)是一件坏事



    1-我不认为这是一个适当的证据。虽然我认为一个适当的证据也会给出这个答案。

    。。。你在问比较器的运行时复杂性,比较器做了一些比较?!还是排序?比较器只是封装了一个确定两个元素之间顺序的方法。实现任何将集合排序为某种顺序的函数都需要确定两个元素之间的相对顺序。
    O(n) x O(log(n))