可以使用Python优化此函数以在O(n)时间内运行吗?

可以使用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)]

下面是一个场景

该函数接受一个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)]

    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循环中的求和和和搜索都是二次的