Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编写函数来查找列表中的最长路径(可能是递归?)_Python - Fatal编程技术网

Python 编写函数来查找列表中的最长路径(可能是递归?)

Python 编写函数来查找列表中的最长路径(可能是递归?),python,Python,我有一个多达50个项目的排序列表,如下所示: [50120160180190250260280300400410475] 我在另一个列表(大约20个)中列出了法律上可能的“空格”: [30,60,70] 基本上,我想用这些空格作为每个值之间的允许值来计算出可能的最长直线 在这种情况下,我们会 50,120,180,250,280 作为我们最长的一行(5项)。希望我能从你的例子中理解: base_list=[50120160180190250260280300400410475] 空格=[30,6

我有一个多达50个项目的排序列表,如下所示: [50120160180190250260280300400410475]

我在另一个列表(大约20个)中列出了法律上可能的“空格”: [30,60,70]

基本上,我想用这些空格作为每个值之间的允许值来计算出可能的最长直线

在这种情况下,我们会 50,120,180,250,280
作为我们最长的一行(5项)。

希望我能从你的例子中理解:

base_list=[50120160180190250260280300400410475]
空格=[30,60,70]
def计算(基本):
对于枚举中的i,x(基数):
如果空间中的0==i或(base[i]-base[i-1]):
持续
其他:
德尔基[i]
返回计算(基本)
返回基地
打印(计算(基本列表[:]))

记住每个项目以该项目结束的最长路径:

>>> p = {}
>>> for i in items:
        p[i] = max((p.get(i - s, []) for s in spaces), key=len) + [i]

>>> max(p.values(), key=len)
[50, 120, 190, 250, 280]

一个可能的简单解决方案是迭代列表,保留符合需求的每个可能子序列的列表

def最长间隔子序列(值、空格):
候选人=[]
对于值中的元素:
#查看每个子序列
对于范围内的i(len(候选人)):
候选者=候选者[i]
#如果新元素与
#候选人中最高的,添加它。
如果空格中的元素-候选者[-1]:
#制作一个副本并将元素添加到其中
新建=列表(候选)
new.append(元素)
候选人。追加(新)
#也许这个元素是最长序列的开始
候选项。追加([元素])
返回最大值(候选项,键=len)
这远不是最有效的算法,但它是有效的

这个幼稚的算法有一个地方确实需要改进:它永远保留所有候选列表,因此占用的内存远远超过它所需要的。为了节省内存,您只需要删除不能再扩展的短候选项,这比听起来要复杂一点


正如您在问题标题中所猜测的,递归也可以帮助解决这个问题。你可以采取一种贪婪的方法,但不只是返回结果,你必须继续,确保它确实是最长的。

因此,如果我读对了,那就是从
50
开始,然后
+70
+60
+70
+30
?这是正确的,但它可以是任意的(+30,+60,+70),只要它导致最长的选项。您可能不应该修改输入列表,也不应该在对列表进行迭代时修改列表。此外,您的解决方案只找到具有给定间距的子序列,而不是最长的子序列。对于
[0,30,50,120]
(以及与示例相同的空格),答案应该是
[0,50,120]
,但您的代码给出了
[0,30]
。这对其他示例不起作用,但感谢您的尝试。我认为这可能必须以递归的方式进行,但我一直无法理解如何以这种方式进行。我认为这是可行的。我现在正在其他几个案例中测试它,但它看起来很有效。谢谢!也许可以添加几句解释?这是一个很好的解决方案,但它有点神秘。谢谢,我认为这一个也可以。也解释得很好,非常感谢。它确实不是很有效。例如
最长间隔的子序列(范围(30),[1,2])
已经建立了570万个候选序列,并且运行需要几秒钟。