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

时间:2019-07-07 21:21:58

标签: java sorting comparator

我有一个自定义对象,可以说Person.java和字段String nameint age。可以说我有对象Person的100个不同实例,我想使用自定义比较器s.t进行排序。年龄最大的人会比最小的人走。编写比较器本身很容易-只需实现compareTo方法,然后将对象放入List中(或将Queue放在更好的位置?)。但是,此比较器方法的运行时间是多少?本身执行某种自定义排序方法是否更快?

2 个答案:

答案 0 :(得分:0)

我想您正在使用JDK8或类似版本。

在大多数情况下,您只需要以下代码即可以良好的性能执行您描述的任务:

List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
// adding all elements
...
list.sort(comparator);

作为替代方案,如果实现Comparable接口,则可以使用Collections.sort()方法。有关更多详细信息,请参见List.sort()Collections.sort()

运行时复杂度

list.sort(comparator);行的运行时复杂度为

O(n) x O(log(n)) x C

我们应该考虑两个部分:

  1. O(n) x O(log(n)):与排序算法有关,如List.sort()的文档中所述,在最坏的情况下,我们可以期待n*log(n),这就是为什么我使用大的{{ 1}},但是如果列表是部分排序的,则运行时间接近O
  2. n:与C实现的运行时间有关,正如您提到的,您只是在比较它们的使用期限,这很简单,不应该在意。因此,该实现的运行时间预计为常数,也称为compareTo()。 (这可能是您要的)

如果第二点为true,则总运行时复杂度应表示为:

O(1)

答案 1 :(得分:0)

  

此比较器方法的运行时间是多少?

这取决于您实现的方式(!)但是,如果您只是比较各个对象中age和/或name字段的值,则应该为{{1} }。

排序算法的复杂性通常用它执行的比较次数来表示。因此,如果选择的排序算法为O(1),而您的O(NlogN)Comparator,则我们可以预测 1 总体复杂度为O(1)或{ {1}}。

  

执行某些自定义排序方法是否更快?

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

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

  • 更一般地说,Java 8和更高版本中的内置O(NlogN)使用的算法是最新的算法。您不会花费大量成本(在开发工作和/或可维护性上)来改进它们。


该问题的气味为“ premature optimization”。请仔细阅读这意味着什么以及为什么(通常)是一件坏事。


1-我不认为这是适当的证明。尽管我认为适当的证明也会给出答案。