【问题标题】:largest monotonically increasing or decreasing subsequence最大单调递增或递减子序列
【发布时间】:2016-10-31 05:51:56
【问题描述】:

以下是我的最大单调子序列代码(增加或减少)。在编写此代码之前,我没有进行任何研究,并且不知道这是一个常见的计算机科学问题。从我随后的研究来看,似乎普遍接受的最有效的算法是 O(N log N)。这些通常是动态编程类型的解决方案,目前我有点想不通。

我不是算法专家,但下面的代码不是 O(N) 吗?我遍历每个列表两次,一次寻找递增序列,一次寻找递减。

我也很感激有关清理它的任何建议。我意识到这些功能非常重复,但如果不重复第二个功能/通道,我找不到一种一次性完成所有操作的好方法。

def largest_monotonic_subsequence(lst):

    def increasing(lst):
        beg,end,best = 0,0,[0,0]
        for i in range(len(lst)-1):
            if lst[i] <= lst[i+1]:
                end = i+1
                if end - beg > best[1] - best[0]:
                    best = beg, end 
            else:
                beg = i+1
        return (best[0],best[1]+1)

    def decreasing(lst):
        beg,end,best = 0,0,[0,0]
        for i in range(len(lst)-1):
            if lst[i] >= lst[i+1]:
                end = i+1
                if end - beg > best[1] - best[0]:
                    best = beg, end 
            else:
                beg = i+1
        return (best[0],best[1]+1)

    incr = increasing(lst)
    decr = decreasing(lst)
    return lst[slice(*max([incr,decr], key = lambda x: x[1]-x[0]))]

【问题讨论】:

  • 来自维基百科,“这个子序列不一定是连续的,或者是唯一的”
  • In mathematics,子序列是一个序列,可以通过删除一些元素而不改变其余元素的顺序从另一个序列中派生出来。 [...] 子序列不应与子字符串混淆。
  • 糟糕。所以这个问题是我正在帮助我的 SO 的 MIT OCW 课程的一部分 - 在我解决它之后,我在谷歌上搜索“单调递增测试”并且显然没有足够接近 RTFM。如果连续不是标准,那么我显然可以看到为什么这将是一个更困难的问题。为愚蠢的问题道歉。

标签: python algorithm subsequence


【解决方案1】:

您可以使用符号 arg(设置为 +1 或 -1)来反转比较的意义

if sgn * lst[i] <= sgn * lst[i+1]:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2019-11-18
    • 1970-01-01
    • 2016-04-11
    • 2017-07-07
    • 2012-10-17
    相关资源
    最近更新 更多