【发布时间】:2021-03-25 11:17:37
【问题描述】:
每次编码面试时,我总是避免使用Java流,因为我不能很好地分析时间复杂度。
例如:在我的日常工作中,我可能会这样写:
Arrays.stream(a).distinct().sorted().toArray();
获取唯一编号并对其进行排序。
但我很好奇时间复杂度会是……? is distinct().sorted 会变成嵌套循环吗?
我应该把它们分开吗?
int[] arr = Arrays.stream(a).distinct().toArray();
Arrays.stream(arr).sorted().toArray();
所以有时当我接受采访时,我会使用 set 来区分然后对它们进行排序.... 但我真的很想写一个干净的代码...
如果有人可以帮忙!谢谢!
【问题讨论】:
-
"... 一次编程面试,我总是避免使用 Java 流" - 这是非常错误的。
-
忽略并行流,对于
distinct(),它对未排序的流使用HashSet(O(n) 摊销)并简单地比较排序流的相邻值(O(n))。对于sorted(),性能一般为O(n*log(n))。这意味着整体性能是O(n*log(n))。 -
"当我接受编码面试时,我总是避免使用 Java 流,因为我不能很好地分析时间复杂度" 作为面试官,我会寻找人谁可以编写几乎所有其他人的可读代码。如果某件事效率低下,并且我认为效率低下很重要,我可以决定询问候选人是否有其他方法可以采取,以及为什么他们倾向于他们选择的方法。我认为作为一般规则,尝试将您的行为改变为您认为他们想要的行为是一个坏主意。做自然而然的事。
-
我不知道!因为上次面试官告诉我,distinct().sorted() 的时间复杂度会是 O(n)*O(nlogn) = O(n^2logn),所以我才这么糊涂……现在我想他错了,如果这是一个嵌套循环,逻辑就错了! distinct() 应该在 sorted() 之前完成吗?对吧~?
-
如果你的面试官说是 O(n^2 log n) 那么你的面试官错了,可能不应该面试人。
标签: java java-stream