我如何才能用Python语言开发一个高效且可伸缩的算法实现,以便在一大堆整数中找到最长的升序序列?我有一个包含数百万个元素的列表,而我当前的解决方案太慢了.以下是我当前的Python代码作为起点:

def longest_increasing_subsequence(nums):
    n = len(nums)
    lis = [1] * n
    for i in range(1, n):
        for j in range(0, i):
            if nums[i] > nums[j] and lis[i] < lis[j] + 1:
                lis[i] = lis[j] + 1

    max_length = max(lis)
    result = []

    for i in range(n - 1, -1, -1):
        if lis[i] == max_length:
            result.append(nums[i])
            max_length -= 1

    return result[::-1]

我注意到这个代码对于大的输入列表来说非常慢.有没有办法优化这个算法,甚至使用另一个算法,更适合在一个大的整数列表中寻找最长的升序序列?我对任何改善运行时间和内存要求的 idea 都持开放态度.提前谢谢!

推荐答案

如上所述,您的解决方案具有二次时间复杂性.然而,according to wikipedia在O(nlog(N))的时间复杂度内可以找到最优解.

我修复了我找到的here个代码,以获得以最佳时间复杂度运行的函数,并且我测试了结果与原始函数的一致性:

# Binary search
def GetCeilIndex(arr, T, l, r, key):
    while r - l > 1:
        m = l + (r - l) // 2
        if arr[T[m]] >= key:
            r = m
        else:
            l = m

    return r


def LongestIncreasingSubsequence(arr):
    n = len(arr)

    # Initialized with 0
    tailIndices = [0 for i in range(n + 1)]

    # Initialized with -1
    prevIndices = [-1 for i in range(n + 1)]

    # it will always point
    # to empty location
    length = 1
    for i in range(1, n):
        if arr[i] < arr[tailIndices[0]]:
            # new smallest value
            tailIndices[0] = i

        elif arr[i] > arr[tailIndices[length - 1]]:
            # arr[i] wants to extend
            # largest subsequence
            prevIndices[i] = tailIndices[length - 1]
            tailIndices[length] = i
            length += 1

        else:
            # arr[i] wants to be a
            # potential condidate of
            # future subsequence
            # It will replace ceil
            # value in tailIndices
            pos = GetCeilIndex(arr, tailIndices, -1, length - 1, arr[i])

            prevIndices[i] = tailIndices[pos - 1]
            tailIndices[pos] = i

    res = []
    i = tailIndices[length - 1]
    while len(res) < length:
        res.append(arr[i])
        i = prevIndices[i]
    res.reverse()

    return res

Python相关问答推荐

为什么我的主页不会重定向到详细视图(Django)

情节生成的饼图文本超出页面边界

Altair -箱形图边界设置为黑色,中线设置为红色

仅对matplotlib的条标签中的一个条标签应用不同的格式

在Windows上启动新Python项目的正确步骤顺序

使用regex分析具有特定字符的字符串(如果它们存在)

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

处理(潜在)不断增长的任务队列的并行/并行方法

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

基于索引值的Pandas DataFrame条件填充

Pandas计数符合某些条件的特定列的数量

如何在Polars中从列表中的所有 struct 中 Select 字段?

使用NeuralProphet绘制置信区间时出错

不允许访问非IPM文件夹

Django admin Csrf令牌未设置

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

Flask Jinja2如果语句总是计算为false&

比Pandas 更好的 Select