【发布时间】:2021-09-16 05:10:22
【问题描述】:
我已经学会了进行二分搜索的一维数组方式:
def exist(target, array):
lower = -1
upper = len(array)
while not (lower + 1 == upper):
mid = (lower + upper)//2
if target== array[mid]:
return True
elif target< array[mid]:
upper = mid
else:
lower = mid
return False
但是,现在我面临这个包含employee_id 和employee_birthyear 的二维数组list2:
[[2, 1986],
[4, 1950],
[6, 1994],
[9, 2004],
[12, 1988],
[13, 1964],
[16, 1987],
[18, 1989],
[19, 1951],
[20, 1991]]
我想使用上面的纯二进制搜索算法编写一个函数,该算法以一年(作为整数)和list2 为参数,并返回具有匹配employee_birthyear 的employee_id 列表。
我该怎么做?
这是我想到的:
lst2 = [ j for i in list2 for j in i]
def get_IDs_with_birthyear(year, lst2):
lower = -1
upper = len(lst2)
while not (lower + 1 == upper):
mid = (lower + upper)//2
if year = lst2[mid]:
return mid
return []
更新:
我尝试对我的year 进行排序并进行二进制搜索,但是当同一年份有多个id 时,我无法检索所有ID。
ids = []
def get_IDs_with_birthyear(year, employee_with_birthyear_list):
data2 = sorted(employee_with_birthyear_list, key=lambda d: d[1])
years = [d[1] for d in data2]
id = [d[0] for d in data2]
lower = -1
upper = len(years)
while not (lower + 1 == upper):
mid = (lower + upper)//2
if year == years[mid]:
ids.append(id[mid])
return ids
elif year < years[mid]:
upper = mid
else:
lower = mid
return False
结果应该得到 [101, 201, 1999632, 1999649],但我只得到 [1999632]
result = get_IDs_with_birthyear(1949, ewby)
我在我的函数中做错了什么?
【问题讨论】:
-
这是一个过滤问题,而不是二分查找问题。二分搜索在每次迭代中将搜索空间减半。除非您的数据按年份排序,否则二进制搜索可能会抛出匹配项......您真正想要的是遍历您的 2D 列表并过滤掉那些与出生年份不匹配的列表。
-
为了澄清,二进制搜索通常用于搜索单个感兴趣的值,而不是子集。二分查找也需要对输入数据进行排序。
-
如果您的列表按年份排序,您可以这样做;一般来说,二分搜索依赖于根据某种总顺序对数据进行排序,并且在二维点上没有一个“自然”的总顺序。
-
二进制搜索实际上适用于查找范围,而不仅仅是单个值。看看我发布的关于查找范围的答案。
-
大家好!是的,我理解使用这种方法的问题,但这是我的任务要求我做的,我使用了 kcsquared 和 @Todd 的建议,通过对年份进行排序然后进行搜索,但面临另一个问题
标签: python binary-search