当前位置: 首页 > 知识库问答 >
问题:

将两个有序数组合并成一个更大的有序数组的时间复杂度是多少?

方宁
2023-03-14

下面的代码是我对以下问题的解决方案:

给定 2 个按升序排序的整数数组,编写一个函数,将这两个数组合并为一个更大的排序数组。例如,给定数组 arr1 = [[0, 3, 4, 31] 和 arr2 = [4, 6, 30],求解函数应返回数组 [0, 3, 4, 4, 6, 30, 31]。

我的解决方案:

function mergeSortedArrays(arr1, arr2) {
    // Check input
    if (arr1.length === 0 && arr2.length === 0) {
        return arr1;
    } else if (arr1.length === 0) {
        return arr2;
    } else if (arr2.length === 0) {
        return arr1;
    }

    // Initialize variables
    let i = 0, j = 0;
    const mergedArray = [];

    // Loop through & compare
    while (i < arr1.length && j < arr2.length) {
        if (arr1[i] <= arr2[j]) {
            mergedArray.push(arr1[i]);
            i++;
        } else {
            mergedArray.push(arr2[j]);
            j++;
        }
    }

    if (j < arr2.length) {
        while (j < arr2.length) {
            mergedArray.push(arr2[j]);
            j++;
        }
    } else if (i < arr1.length) {
        while (i < arr1.length) {
            mergedArray.push(arr1[i]);
            i++;
        }
    }

    return mergedArray; // O(1)
}

上面的解决方案运行良好。然而,我在分析我所使用的算法的最坏情况时间复杂度时遇到了一些麻烦。乍一看,它似乎具有线性时间复杂度O(n ),但是进一步观察,比较两个数组之间的元素的第一个循环中的迭代次数并不仅仅受两个数组中任一个的长度限制。更具体地说,它似乎与每个数组的上限和下限有关。

TLDR:上面这个函数的时间复杂度是多少?

共有3个答案

杨骏
2023-03-14

该算法的时间复杂度将为O(arr1.length arr2.length),因为实际上我们正在迭代两个数组一次。

崔恺
2023-03-14

在第一个while循环中,在每次迭代中,都会递增i或j。while循环可以运行的最大次数为(arr.length-1)(arr.length-1),因为任何更多的循环都将超出测试条件。

让我们将I和j的最终状态称为k和l,其中k或l将等于它们各自的上限,而另一个将严格小于它们的上限。这意味着while循环已经运行了k ^ 1次

在循环之后,您将执行另外两个互斥的同时循环,每个循环都从k/l开始,直到达到上限。这意味着这两个循环将运行(arr.length-k)或(arr2.length-l)次。

所以你运行的最终结果是第一个while循环:(k l)第二组循环:

   if k != arr.length (implies l == arr2.length): (arr.length - k) 
   if l != arr2.length (implies k == arr.length): (arr2.length - l)

所以total是

  if k != arr.length: (k + l) + (arr.length - k) = l + arr.length = arr2.length + arr.length
  if l != arr2.length: (k + l) + (arr2.length - l) = k + arr2.length = arr.length + arr2.length

两者都导致总执行计数为 arr.length arr2.length,因此复杂度为 O(m n)

贺玉石
2023-03-14

o(m ^ n ),其中m和n是各自阵列的大小。

 类似资料:
  • 我试图找出哪种是执行以下任务的最快方法: 编写一个函数,接受两个数组作为参数——每个数组都是一个排序的严格升序的整数数组,并返回一个新的严格升序的整数数组,其中包含两个输入数组中的所有值。 例如,合并[1,2,3,5,7]和[1,4,6,7,8]应该返回[1,3,4,5,6,7,8]。 由于我没有受过正规的编程教育,我觉得算法和复杂性有点陌生:)我有两种解决方案,但我不确定哪一种更快。 解决方案

  • 本文向大家介绍C++实现两个有序数组的合并,包括了C++实现两个有序数组的合并的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现两个有序数组合并的具体代码,供大家参考,具体内容如下 剑指offer面试题5延展题: 问题:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空间容纳A2。请实现一个函数,把A2中所有数字插入A1中,并且所有的数字是排序(默认升序)的。 思路:在

  • 本文向大家介绍iOS常用算法之两个有序数组合并(要求时间复杂度为0(n)),包括了iOS常用算法之两个有序数组合并(要求时间复杂度为0(n))的使用技巧和注意事项,需要的朋友参考一下 思路: 常规思路: 先将一个数组作为合并后的数组, 然后遍历第二个数组的每项元素, 一一对比, 直到找到合适的, 就插入进去;   简单思路: 设置数组C, 对比A和B数组的首项元素, 找到最小的, 就放入数组C,依

  • 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,

  • 两个反向数组合并成一个排序数组的时间复杂度是多少? 是O(n)还是O(log n)?

  • 我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?