【问题标题】:What is the time complexity of merging two sorted arrays into a larger sorted array?将两个排序数组合并成一个更大的排序数组的时间复杂度是多少?
【发布时间】:2020-11-16 10:22:39
【问题描述】:

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

给定 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:上述函数的时间复杂度是多少?

【问题讨论】:

    标签: javascript arrays merge time-complexity


    【解决方案1】:

    O(m+n) 其中 m 和 n 是各自数组的大小。

    【讨论】:

      【解决方案2】:

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

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

      在循环之后,您将执行另外两个互斥的 while 循环,每个循环都从 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)
      

      所以总数是

        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)

      【讨论】:

        【解决方案3】:

        此算法的时间复杂度为 O(arr1.length + arr2.length),因为我们实际上是对两个数组进行了一次迭代。

        【讨论】:

          【解决方案4】:

          好吧,因为它只有 2 个数组并且算法很简单,而且您在所有索引上都迭代 arr1 和 arr2,最坏的情况确实是 O(n + m) 其中 n=arr1.length 和 m=arr2 。长度。但请注意,这不仅是最坏的情况,也是所需的确切时间,这意味着它也是 Θ(m+n)

          【讨论】:

            猜你喜欢
            • 2011-07-04
            • 2020-10-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-12
            相关资源
            最近更新 更多