繁体   English   中英

"Java stream().sorted 或 list.sort() 不会增加时间复杂度吗?"

[英]Does Java stream().sorted or list.sort() not increases time complexity?

在进行一些排序时,有些人建议在 Java 中使用stream().sorted<\/code>或list.sort()<\/code>方法来降低时间复杂度。 但是,我认为这些方法也使用了一些具有相似时间复杂度的排序算法。

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());

使用嵌套循环的排序算法通常是O(n²)<\/code>复杂度,因为内循环的每次迭代都发生在外循环的每次迭代中。 其中一些算法将是

  • 插入排序;<\/li>
  • 冒泡排序;<\/li>
  • 等等;<\/li><\/ul>

    但是,其他不使用您提到的嵌套循环,例如,最常用的一般排序算法是 QuickSort,它代表分治算法,它首先选择一个枢轴值并根据所述重新排列数组枢轴值,所有较小的值都在它之前,所有较大的值都在它之后(不一定排序)。

    快速排序为O(nlog(n))<\/code>平均案例复杂度。 请记住,一些更高级的排序算法也具有O(n^2)<\/code>的最坏情况复杂度。

    事实上,一些排序实现实际上在排序之前对数组进行了洗牌,只是为了避免最坏的情况。

    我在下面留下了一些关于 Quicksort 的信息。

    快速排序说明及其工作原理<\/a>

关于任何一种算法,你必须了解的第一件无能为力的事情<\/strong>是,仅仅谈论<\/strong>算法不会显着改变你在这方面的知识<\/strong>。

您必须study and practice them<\/code> ,逐步实现算法。

如果想提高您对排序算法的理解,您需要从bubble sort<\/code><\/strong>和insertion sort<\/code><\/strong>等非常基本的开始( Wikipedia<\/code><\/strong>中的描述和伪代码足以掌握这个想法并开始编码)。 当您对merge sort<\/code><\/strong>和快速排序<\/strong><\/a>的基础知识有了深入的了解时。

下面是关于 JDK 提供的所谓的双轴快速排序<\/strong>内部发生的事情的一个小见解<\/strong><\/a>。

事实上,它是一种非常advanced compound algorithm<\/code><\/strong> ,除了传统的快速排序之外,还需要merge sort<\/code> 、 heap sort<\/code>和在海量数据集的情况下进行parallel computing<\/code> 。

只有当您了解基本算法的所有优点proc and cons<\/code>时(例如为什么存在不同的分区方案,为什么快速排序优于合并排序,同时在更坏的情况下合并排序的时间复杂度似乎更好等)才有意义推测双轴快速排序<\/strong>的optimizations<\/code> 。

现在简短回答关于内置快速排序的性能:

保证任何数据的 n*log(n)<\/strong>

排序总是发生inside the array<\/code> 。 如果数据源由ArrayList<\/code>或CopyOnWriteArrayList<\/code>数组支持,则其底层数组将被排序。

否则,例如,如果您使用LinkedList<\/code>拨号,则会在内存中分配一个新数组,并且列表中的所有数据都将复制到该数组中,然后进行排序。

当您使用stream<\/code>拨号时,它not affect the source<\/code> 。 来自源的全部数据需要加载到内存中进行排序。 然后您很可能会将其存储在品牌系列中。

结论:<\/strong>

这些方法的时间复杂度为nlog(n) 这是排序数组的最佳时间复杂度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM