可以使用Python优化此函数以在O(n)时间内运行吗?
下面是一个场景 该函数接受一个n项权重数组和一个q容量数组。目标是根据每个箱子的容量确定每个箱子可以容纳的物品数量 我已经编写了以下函数,但我遇到的问题是,它在非常大的输入值上超时。请在下面查看:可以使用Python优化此函数以在O(n)时间内运行吗?,python,python-3.x,algorithm,optimization,time-complexity,Python,Python 3.x,Algorithm,Optimization,Time Complexity,下面是一个场景 该函数接受一个n项权重数组和一个q容量数组。目标是根据每个箱子的容量确定每个箱子可以容纳的物品数量 我已经编写了以下函数,但我遇到的问题是,它在非常大的输入值上超时。请在下面查看: def noItems(weights, capacities): number_of_items = 0 result = [] weight_sums = [sum(weights[0:w:1]) for w in range(1, len(weights) + 1)]
def noItems(weights, capacities):
number_of_items = 0
result = []
weight_sums = [sum(weights[0:w:1]) for w in range(1, len(weights) + 1)]
for i in range(0, len(capacities)):
for j in range(0, len(weight_sums)):
if weight_sums[j] <= capacities[i]:
number_of_items = number_of_items + 1
result.append(number_of_items)
number_of_items = 0
return(result)
def noItems(重量、容量):
项目数量=0
结果=[]
权重_总和=[范围(1,len(权重)+1)内w的总和(权重[0:w:1])]
对于范围(0,len(容量))内的i:
对于范围(0,len(权重和)内的j:
如果权重_和[j]1和<1000
容量[i]>1和<10^9
输出:[3,5,4,0,7,1]
如何优化此函数以获得更快的运行时间,从而使其不会在非常大的输入上超时?您可以在O(nlogn)
时间内使用累积权重列表上的二进制搜索来解决此问题
from bisect import bisect_right
def noItems(weights, capacities):
result = []
# or you can use itertools.accumulate():
weight_sums = [0] * (len(weights))
weight_sums[0] = weights[0]
for i in range(1, len(weights)):
weight_sums[i] = weight_sums[i-1] + weights[i]
for x in capacities:
number_of_items = bisect_right(weight_sums, x)
result.append(number_of_items)
return(result)
we = [2, 3, 5, 8, 1, 4, 7]
ca = [10, 20, 18, 1, 40, 4]
print(noItems(we, ca))
[3, 5, 4, 0, 7, 1]
O(n)
仅适用于先前排序的容量。您可以在O(nlogn)
时间内使用累积权重列表上的二进制搜索解决此问题
from bisect import bisect_right
def noItems(weights, capacities):
result = []
# or you can use itertools.accumulate():
weight_sums = [0] * (len(weights))
weight_sums[0] = weights[0]
for i in range(1, len(weights)):
weight_sums[i] = weight_sums[i-1] + weights[i]
for x in capacities:
number_of_items = bisect_right(weight_sums, x)
result.append(number_of_items)
return(result)
we = [2, 3, 5, 8, 1, 4, 7]
ca = [10, 20, 18, 1, 40, 4]
print(noItems(we, ca))
[3, 5, 4, 0, 7, 1]
O(n)
仅适用于之前排序的容量。我投票结束这个问题,因为它属于“最佳解决方案”和“更快的运行时间”是不同的内容。请提供一小部分权重和容量,以及所需的结果。@RickJamesupdate@mangusta我的解决方案是在非常大的输入上超时。所以我想看看能做些什么来防止这种情况。我投票结束这个问题,因为它属于“最佳解决方案”和“更快的运行时间”是不同的东西。给一小部分权重和容量,再加上期望的结果。@RickJames做了一个回答update@mangusta我的解决方案是在非常大的输入上超时。所以我想看看能做些什么来防止这种情况。谢谢你的帮助,但是函数仍然在大的输入上超时。因为二次累积和(我没有注意到这个事实),累积和就是问题所在?这是怎么回事?使用线性累积和编辑。不,计算和搜索双for循环中的和都是quadratic感谢您的帮助,但函数仍然在大输入上超时。由于二次累积和(我没有注意到这个事实),累积和是个问题?这是怎么回事?用线性累积sumsNo编辑,双for循环中的求和和和搜索都是二次的