是否将数组拆分为2个子数组并递归求解它们仍然是O(log(n))?

nds*_*svw 1 algorithm runtime time-complexity

我在https://www.geeksforgeeks.org/median-of-two-sorted-arrays/上找到了一种计算2个排序列表中位数的算法。它说是O(log(n))。但这是真的吗?

我感到困惑的是:这些行将一个数组分成2个子数组(使用Python的切片),然后递归地解决它们:

if n % 2 == 0: 
   return getMedian(arr1[:int(n / 2) + 1], 
      arr2[int(n / 2) - 1:], int(n / 2) + 1) 
else: 
   return getMedian(arr1[:int(n / 2) + 1],  
      arr2[int(n / 2):], int(n / 2) + 1) 
Run Code Online (Sandbox Code Playgroud)

但是对我来说,拆分数组就像O(n)一样。所以我认为整个算法必须是O(n * log n)...

在这里,您可以看到我正在谈论的算法的完整代码:

# using divide and conquer we divide 
# the 2 arrays accordingly recursively 
# till we get two elements in each  
# array, hence then we calculate median 

#condition len(arr1)=len(arr2)=n 
def getMedian(arr1, arr2, n):  

    # there is no element in any array 
    if n == 0:  
        return -1

    # 1 element in each => median of  
    # sorted arr made of two arrays will     
    elif n == 1:  
        # be sum of both elements by 2 
        return (arr1[0]+arr2[1])/2

    # Eg. [1,4] , [6,10] => [1, 4, 6, 10] 
    # median = (6+4)/2     
    elif n == 2:  
        # which implies median = (max(arr1[0], 
        # arr2[0])+min(arr1[1],arr2[1]))/2 
        return (max(arr1[0], arr2[0]) + 
                min(arr1[1], arr2[1])) / 2

    else: 
        #calculating medians      
        m1 = median(arr1, n) 
        m2 = median(arr2, n) 

        # then the elements at median  
        # position must be between the  
        # greater median and the first  
        # element of respective array and  
        # between the other median and  
        # the last element in its respective array. 
        if m1 > m2: 

            if n % 2 == 0: 
                return getMedian(arr1[:int(n / 2) + 1], 
                        arr2[int(n / 2) - 1:], int(n / 2) + 1) 
            else: 
                return getMedian(arr1[:int(n / 2) + 1],  
                        arr2[int(n / 2):], int(n / 2) + 1) 

        else: 
            if n % 2 == 0: 
                return getMedian(arr1[int(n / 2 - 1):], 
                        arr2[:int(n / 2 + 1)], int(n / 2) + 1) 
            else: 
                return getMedian(arr1[int(n / 2):],  
                        arr2[0:int(n / 2) + 1], int(n / 2) + 1) 

 # function to find median of array 
def median(arr, n): 
    if n % 2 == 0: 
        return (arr[int(n / 2)] +
                arr[int(n / 2) - 1]) / 2
    else: 
        return arr[int(n/2)] 


# Driver code 
arr1 = [1, 2, 3, 6] 
arr2 = [4, 6, 8, 10] 
n = len(arr1) 
print(int(getMedian(arr1,arr2,n))) 

# This code is contributed by 
# baby_gog9800 
Run Code Online (Sandbox Code Playgroud)

Mat*_*ans 5

是的,一点没错。许多候选人在错过节目采访时都留下了不好的印象。

在python中切片列表会产生一个副本。

复制列表的一半需要O(n)时间。

而且该算法总共花费O(n)时间(您应该弄清楚为什么它不是O(n log n)

您确实需要知道您的语言如何针对任何特定示例解决此问题,因为某些语言提供了在不复制元素的情况下对列表进行切片的方法。list.sublist(start,end)例如,在java中,您可以调用,以获取不复制的切片。

  • 在Java的情况下,它是库,而不是语言。接口方法“ List.sublist()”的约定是,它返回原始列表的“视图”,在没有通过视图进行结构更改的情况下有效。就像java.util.ArrayList中那样,这使得O(1)实现是可行且可能的,但并不能保证。 (3认同)