【发布时间】:2017-06-26 03:02:40
【问题描述】:
在 java 8 中如何有效地找到第 K 个最小的?第 K 个最小的是
http://www.geeksforgeeks.org/kth-smallestlargest-element-unsorted-array/
我在下面尝试过。如果有一个更有效的解决方案可以提供 Java-8 的安全性,例如我不应该在访问索引之前检查大小以防空数组等。我相信我自己的解决方案是安全的空数组。
如果存在我的 Java-8 方法和更好的 Java-8 方法的可证明的时间复杂度比较,我们将不胜感激。谢谢。
package lab.rat.jerry.kthsmallest;
import static java.util.stream.Collectors.toList;
import java.util.Arrays;
import java.util.List;
public class KthSmallest {
// Inputs
static int k = 3;
static Integer[] myIntArray = {2, 3, 1, 4, -2, 0, -3, 0, -1, 5 };
public static void main(String[] args) {
List<Integer> list = Arrays.asList(myIntArray);
System.out.println(list
.stream()
.sorted()
.distinct()
.limit(k)
.skip(k-1)
.collect(toList())
);
}
}
【问题讨论】:
-
您正在对输入进行排序,这意味着您的运行时间为 O(nlog(n))。如果我没记错的话,找到第 k 个最小(或最大)元素的最佳算法需要 O(n) 时间。该算法类似于快速排序,但运行速度更快,因为它不必对整个输入进行排序。
-
我不确定关于时间复杂度分析的问题是否适合本网站。最好去cs或者codereview子站
-
为什么要将单个元素收集到
List? -
这是一个算法问题,所以应该在cs上问。
-
@Eran 的意思是quickselect。关于实际问题,没有 java-8 特定 改进。 Peter Lawrey 提到的基于
TreeSet的解决方案更容易实现,并且仍然比基于流的方法更好。但与 quickSelect 一样,它仍然不是 Java 8 特定的。
标签: java java-8 java-stream comparator