我需要创建一个算法来解决以下问题:
给定两个排序的数组(都有n
元素)我需要修改它们,以便第一个数组中的每个元素都小于第二个数组中的任何元素。我可以做的操作是比较两个元素并交换两个元素。
我的第一个解决方案就是:
设a是第一个数组的最后一个元素,让b为第二个数组的第一个元素。如果a<b
然后我们停止,否则我们交换它们并继续更小的数组n-1(擦除第一个中的最后一个元素,第二个中的第一个元素)。
这显然是线性的。
但是,如果我想最小化此算法中的比较次数呢?在这一个中,我进行了线性数量的交换和比较。我可以通过比较来缩小规模吗?
我认为我可以进行双二进制搜索。意思是我搜索这样的元素a&#39;在第一个数组中,然后是一些元素b&#39;在第二个阵列中,但小于他旁边的那个。这具有复杂性O(lg n^2)
。我能做得更好吗?
答案 0 :(得分:1)
您的算法无法使用O(lg n^2)
。
使用二进制搜索,您将减少从O(n)到log(n)的比较次数,但交换操作的次数仍为O(n)
是的,您的算法会略有改进,但复杂性保持不变。您必须执行k
0<=k<=n