这段代码片段的空间复杂性是多少?

时间:2018-03-24 21:51:59

标签: java algorithm

原始问题是here 以下代码段的空间复杂性是多少?我知道时间复杂度为O(log(m+n))。我认为空间复杂度也是O(log(m + n)),但我不确定。

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int lens1, lens2, sumLens;
    lens1 = nums1.length;
    lens2 = nums2.length;
    sumLens = nums1.length + nums2.length;
    if (sumLens % 2 != 0) {
        return findKthSmallest(nums1, 0, lens1, nums2, 0, lens2, sumLens / 2 + 1);
    } else {
        return (findKthSmallest(nums1, 0, lens1, nums2, 0, lens2, sumLens / 2 + 1) + findKthSmallest(nums1, 0, lens1, nums2, 0, lens2, sumLens / 2)) / 2.0;
    }
}

private int findKthSmallest(int[] nums1, int begin1, int end1, int[] nums2, int begin2, int end2, int k) {
    if (end1 > end2) {
        return findKthSmallest(nums2, begin2, end2, nums1, begin1, end1, k);
    }
    if (end1 == 0) {
        return nums2[begin2 + k - 1];
    }
    if (k == 1) {
        return Math.min(nums1[begin1], nums2[begin2]);
    }

    int partA = Math.min(k / 2, end1);
    int partB = k - partA;
    if (nums1[begin1 + partA - 1] == nums2[begin2 + partB - 1]) {
        return nums1[begin1 + partA - 1];
    } else if (nums1[begin1 + partA - 1] > nums2[begin2 + partB - 1]) {
        return findKthSmallest(nums1, begin1, end1, nums2, begin2 + partB, end2 - partB, k - partB);
    } else {
        return findKthSmallest(nums1, begin1 + partA, end1 - partA, nums2, begin2, end2, k - partA);
    }
}

1 个答案:

答案 0 :(得分:0)

初看起来,由于没有使用辅助数据结构,因此该算法似乎是就地的,因此具有O(1)空间复杂度。

- 编辑 -

因此,对于每个递归调用,将向调用堆栈添加一个恒定大小的数据块,从而将空间增加为O(lg(m + n))的调用数。