Python—查找多个值的首次出现的有效方法
我有一个问题:我需要在数组中查找大于或等于多个其他值的第一个值 例如:Python—查找多个值的首次出现的有效方法,python,algorithm,numpy,Python,Algorithm,Numpy,我有一个问题:我需要在数组中查找大于或等于多个其他值的第一个值 例如: array_1 = [-3,2,8,-1,0,5] array_2 = [5,1] 脚本必须在数组_1中找到大于或等于数组_2中每个值的第一个值,因此在这种情况下,基于1的索引的预期结果将是[3,2] 一个简单的循环对我的情况没有任何好处,因为两个数组都有接近百万的值,并且它必须在一分钟内快速执行 运行时间约为半小时的简单循环解决方案: for j in range(0, len(array_2)):
array_1 = [-3,2,8,-1,0,5]
array_2 = [5,1]
脚本必须在数组_1
中找到大于或等于数组_2
中每个值的第一个值,因此在这种情况下,基于1的索引的预期结果将是[3,2]
一个简单的循环对我的情况没有任何好处,因为两个数组都有接近百万的值,并且它必须在一分钟内快速执行
运行时间约为半小时的简单循环解决方案:
for j in range(0, len(array_2)):
for i in range(0, len(array_1)):
if array_1[i] >= array_2[j]:
solution[j] = i
break
编辑:正如@Sergio Tulentsev正确指出的那样,我建议在第一个数组上使用一个循环,在第二个数组上使用
max(array_2)
。首先对数据执行一些预处理:创建一个新列表,该列表中的值仅大于原始数据中的所有前置值,并将它们组合成一个元组,在元组中找到它们的位置是基于1的
例如,对于示例数据[-3,2,8,-1,0,5],这将是:
[(-3, 1), (2, 2), (8, 3)]
请注意,任何查询的答案都只能是1、2或3,因为其他位置的值都小于8
然后,对于每个查询,使用二进制搜索查找左值至少为查询值的元组,并返回找到的元组的右值(位置)。对于二进制搜索,您可以使用对分
库:
import bisect
def solve(data, queries):
# preprocessing
maxima = []
greatest = float("-inf")
for i, val in enumerate(data):
if val > greatest:
greatest = val
maxima.append((val, i+1))
# main
return [maxima[bisect.bisect_left(maxima, (query,))][1]
for query in queries]
示例用法:
data = [-3,2,8,-1,0,5]
queries = [5,1]
print(solve(data, queries)) # [3, 2]
你有没有试过任何代码来看看需要多长时间?我脑子里有一个想法:将第一个数组转换成一个元组数组
(值,值的idx)
,然后按值排序。现在,对于数组_2中的每个元素,您应该能够在O(logN)(提示:二进制搜索)@thierrylahuille:index,而不是values上找到所需的元素您应该在问题中澄清这一点-特别是如果您想从1开始计算索引,似乎是这样的。@A67John:如果这一小时的运行时间是针对两个数组每个都有数百万个元素的情况,那么我上面概述的O(MlogN)方法应该只需要一两秒钟(以O(N)内存为代价)