合并具有最少比较数的两个排序数组的算法
给定两个大小为n和m的类型为T的排序数组a,b。我正在寻找一种将两个数组合并为一个新数组(最大大小为n + m)的算法。 如果比较便宜的话,这很简单。只需从具有最低第一个元素的数组中取出,直到完全遍历一个或两个数组,然后添加其余元素即可。像这样的东西/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array 但是,当比较两个元素时,情况的改变要比将元素从源数组复制到目标数组要贵得多。例如,您可能具有大的任意精度整数或字符串组成的数组,其中比较可能会非常昂贵。只需假设创建数组和复制元素是免费的,而唯一花费的就是比较元素。 在这种情况下,您希望使用最少数量的元素比较合并两个数组。这里有一些示例,您应该可以比简单的合并算法做得更好: a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] 要么 a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 在某些情况下,简单合并算法将是最佳选择,例如 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] 因此,理想情况下,算法应该适当地降级并在阵列交错或至少不会明显恶化的情况下执行最多n + m-1个比较。 对于大小差异较大的列表,应该做得很好的一件事是使用二进制搜索将较小数组的元素插入较大数组。但是,如果两个列表的大小相同且交织在一起,则不会优雅地降低性能。 元素唯一可用的是(总计)排序功能,因此任何使比较便宜的方案都是不可能的。 有任何想法吗? 我在Scala中提出了这一点。我认为比较次数是最佳的,但是我无法证明这一点。至少它比我在文献中发现的要简单得多。 而且自原始帖子以来,我写了一篇有关其工作原理的博客文章。