我通过两个列表执行二进制搜索的速度非常慢

My implementation of binary search through two lists is exhorbitantly slow

对于算法 class 我在,我们正在实施一些算法并测试它们的速度。我选择 Python 作为我的语言来执行此操作。给定 2 个未排序的列表和一个数字 x,我们想找出 S1 中是否有任何元素 a 和 S2 中有 b 使得 a + b = x 。我的做法是这样的:

def find_in(s, s2):
    start, end = 0, len(s2)-1
    while end >= start:
        mid = start + (end - start) // 2
        if s2[mid] == s:
            return True
        if s2[mid] > s:
            start = mid +1
        if s2[mid] < s:
            end = mid - 1
    return False

@timing
def binary_search(x, s1 : list, s2 : list) -> bool:
    return any( find_in(x - s, sorted(s2)) for s in s1 )

因此该函数循环遍历未排序的列表,然后使用二进制搜索在已排序的列表中查找元素 x - s。无论出于何种原因,对于使用 Python 随机模块生成的 10000 列表长度,平均需要 10 秒,这比我尝试的暴力方法要长。我写的东西中是否有一些我遗漏的微妙之处?我觉得好像这应该是 O(n log n),比 O(n2)

逻辑:

  • 给定 a+b = x
  • 这意味着 b = x-a(我们知道 x,我们知道 a,我们需要找出 b 是否存在)。
  • 这意味着 a = x-b(我们知道 x,我们知道 b,我们需要找出 a 是否存在)。 {我猜这部分不是必需的}

代码:

 def AplusB(arr1 , arr2, x):
        #stores the frequency of arr1 (not required i guess)
        d1 = {}
        for i in arr1:
            if(i in d1):
                d1[i] += 1
            else:
                d1[i] = 1
        #stores the frequency of arr2
        d2 = {}
        for i in arr2:
            if(i in d2):
                d2[i] += 1
            else:
                d2[i] = 1
        isAnsExists = False
        for i in arr1:
            val = x - i
            if(val in d2):
                isAnsExists = True
        for i in arr2:
            val = x - i
            if(val in d1):
                isAnsExists = True
        return isAnsExists
    

随机测试:

x = random.randint(0, 10000)
arr1 = [random.randint(0, 100000) for i in range(100000)]
arr2 = [random.randint(0, 100000) for i in range(100000)]
print( AplusB( arr1,arr2 , x))