我正在看其中一个问题How to merge two sorted arrays,并努力尝试使用Java8流转换解决方案。但仍然没有成功。实际上,没有什么有用的东西可以在这里分享。
在函数式编程中必须有一种方法来使用索引来处理这样的循环。在其他语言中如何做到这一点,比如Scala,Clojure,而不改变时间复杂度呢?也许那时我可以尝试在Java中复制它。
编辑:提到这个问题的代码是最高效的,我不想在这方面妥协。
我正在看其中一个问题How to merge two sorted arrays,并努力尝试使用Java8流转换解决方案。但仍然没有成功。实际上,没有什么有用的东西可以在这里分享。
在函数式编程中必须有一种方法来使用索引来处理这样的循环。在其他语言中如何做到这一点,比如Scala,Clojure,而不改变时间复杂度呢?也许那时我可以尝试在Java中复制它。
编辑:提到这个问题的代码是最高效的,我不想在这方面妥协。
8条答案
按热度按时间w8biq8rn1#
事实上,各地的做法都是一样的:循环遍历两个集合,将最少的集合头添加到结果中,然后循环遍历其余的集合,直到其中一个集合(或两个集合)为空。
vsikbqxv2#
我认为这是最简单的表达简单的尾部递归:
rsaldnfx3#
也许是这样的?也许可以做得更漂亮,但总体思路应该可行。
现在,您可以执行以下操作:
f0brbegy4#
您可以将想要合并的数组“ Package ”成二维数组,然后执行以下操作:
注意,数组是否预先排序并不重要。
vx6bjr1n5#
斯卡拉
如果您想要一个惰性求值,即每个元素只在需要时排序和检索,那么一种方法是将
Array
s转换为Iterator
s。Stream
也有惰性求值,但它也可以被索引。n3schb8v6#
@leetwinski的尾部递归解决方案运行良好,但它并不懒惰,下面是Clojure中的一个懒惰解决方案:
示例:
mctunoxg7#
你也可以在scala中使用折叠来完成它,
jslywgbw8#
可以使用第三方库abacus-common完成此操作: