我有一个列表A,其元素从最小到最大排序。例如:
A = 1,5,9,11,14,20,46,99
我想在A中插入未排序的数字列表的元素,同时保持A排序。例如:
B = 0,77,88,10,4
将按如下方式插入A中:
A = 0,1,4,5,9,10,14,20,46,77,88,99
这个问题的最佳解决方案是什么?
答案 0 :(得分:3)
根据最佳定义,最佳可能性太主观。从big-O的角度来看,如果数组A的长度为n1
,数组B的长度为n2
,则可以在max(n2 * log(n2), n1 + n2)
中实现。
这可以通过在O(n log n)
中排序数组B,然后在O(n + m)
答案 1 :(得分:1)
最佳解决方案取决于您如何定义最佳解决方案。
即使时间复杂,它仍然取决于您输入的A和B大小。假设输入大小A是m,B的输入大小是n。
正如萨尔瓦多所提到的,在O(nlogn)中排序B并在O(m + n)中与A合并是一个很好的解决方案。请注意,如果采用基于非比较的排序算法(如计数排序,基数排序等),则可以在O(n)中对B进行排序。
我在这里提供另一种解决方案:循环B中的每个元素并在A中进行二进制搜索以找到插入位置然后插入。时间复杂度为O(nlog(m + n))。
编辑1:正如@moreON指出的那样,二进制搜索然后插入方法假设您列出了实现支持,至少是为了插入和随机访问而分摊的O(1)。还发现时间复杂度应该是O(nlog(m + n))而不是O(nlogm),因为二进制搜索在添加更多元素时花费的时间更多。