我通过两个列表执行二进制搜索的速度非常慢
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))
对于算法 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))