如何解决流 API 中 sorted() 和 thenComparing() 方法按多个字段条件排序的排序复杂度时间是多少?
我有一个信息,Stream API 中的方法 sorted() 可能会使用合并排序 (mergesort)。
然后是时间复杂度:
大 Θ (n (log n) ) - 最佳
大Ω (n (log n) ) - 平均
Big O (n (log n) ) - 最差
空间完整性 - O (n) - 最差
如果我们使用自定义对象的多个字段进行排序,使用 then.comparing() 来构建比较链,那么时间复杂度是多少? >
在这种情况下,您将如何计算时间复杂度?
解决方法
虽然有意未指定 Stream.sorted
中使用的实际算法,但显然有理由不实现其他排序算法,而是使用 Arrays.sort
的现有实现。
当前实现使用 TimSort,这是一种合并排序的变体,可以利用输入中预先排序元素的范围,最好的情况是完全线性的,当输入已经排序时,这也适用输入向后排序的可能情况。在这些情况下,不需要额外的内存。平均情况介于 O(n log n)
的最佳情况和未更改的最坏情况之间。
如 this answer 中所述,关于 Arrays.sort
中使用的算法的一般陈述是棘手的,因为它们都是混合排序算法并且不断改进。
通常,比较函数不依赖于输入(要排序的数组或集合)的大小,使用 Comparator.comparing(…).thenComparing(…)
时不会改变,因为更昂贵的比较函数只添加一个常数因子不会影响整体时间复杂度,只要比较器仍然不依赖于输入大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。