我有一个自定义对象,可以说Person.java
和字段String name
和int age
。可以说我有对象Person
的100个不同实例,我想使用自定义比较器s.t进行排序。年龄最大的人会比最小的人走。编写比较器本身很容易-只需实现compareTo方法,然后将对象放入List
中(或将Queue
放在更好的位置?)。但是,此比较器方法的运行时间是多少?本身执行某种自定义排序方法是否更快?
答案 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
我们应该考虑两个部分:
O(n) x O(log(n))
:与排序算法有关,如List.sort()的文档中所述,在最坏的情况下,我们可以期待n*log(n)
,这就是为什么我使用大的{{ 1}},但是如果列表是部分排序的,则运行时间接近O
。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-我不认为这是适当的证明。尽管我认为适当的证明也会给出答案。