Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Algorithm_Python 2.7_Graph Algorithm - Fatal编程技术网

Python 给定一个有序对(跃点)的子列表,如何计算列表中的路径数(每个路径都是一个跃点序列)

Python 给定一个有序对(跃点)的子列表,如何计算列表中的路径数(每个路径都是一个跃点序列),python,list,algorithm,python-2.7,graph-algorithm,Python,List,Algorithm,Python 2.7,Graph Algorithm,我有一个有序对的列表[[(1,2)、(3,3)、(7,5)],[(2,3)、(3,2)、(6,4)、(2,4)](不一定是2个子列表)。每个有序对对应一个有效路径(例如,从节点1到节点2的(1,2)),每个子列表对应一个级别。我想通过一个列表找到路径的数量,这样我总是遵循一个有序的对路径 对于上面的示例,(1,2)、(2,3)、(1,2)、(2,4)和(3,3)、(3,2)都是有效路径。因此,程序将输出3 我在考虑对每个列表的第二个值进行散列,键是左对的数目({2:1,3:1,5:1}),但这似

我有一个有序对的列表
[[(1,2)、(3,3)、(7,5)],[(2,3)、(3,2)、(6,4)、(2,4)]
(不一定是2个子列表)。每个有序对对应一个有效路径(例如,从节点1到节点2的(1,2)),每个子列表对应一个级别。我想通过一个列表找到路径的数量,这样我总是遵循一个有序的对路径

对于上面的示例,
(1,2)、(2,3)
(1,2)、(2,4)
(3,3)、(3,2)
都是有效路径。因此,程序将输出3

我在考虑对每个列表的第二个值进行散列,键是左对的数目(
{2:1,3:1,5:1}
),但这似乎效率很低,因为我必须以某种方式根据上一个列表迭代的键在当前列表迭代的值中出现的次数进行乘法


这似乎类似于图遍历问题,但DFS需要很大的空间复杂度(计算有序对的函数每次返回一个子列表,而不是完整列表)。

[注意:由于您没有明确说明需要什么输出,我假设您需要给定子列表中可能的路径总数]

有趣的是,这个问题不需要图形知识来解决。你可以用普通的算法知识来解决这个问题(我解决这个问题的方法叫做动态规划)

首先,让我打破这种做法:

  • 为了简单起见,让我们使用一个简单的示例:
  • 现在,我们如何简单地表示,
    达到3的方法的数量
  • 我希望,你现在清楚了上面的概念。如果不再阅读,因为我们将使用它来解决问题

    现在,我们只需要找出起始状态。对于第一级,输入
    1
    4
    的方式是
    1
    ,但输入
    2
    3
    的方式是
    0
    。我希望你也明白这一点

    现在,让我们编写解决方案:

    
    #注:“ll”表示列表列表,即输入
    #将您的输入保存在“ll”中
    #ll=[(x,y)],[(u,v)]]
    #让我们假设,节点的编号从1到n
    n=7#根据需要更改数字或根据需要从文件中获取输入
    #初始状态
    上一个=[0]*(n+1)
    对于ll[0]中的u,v:
    上一个[u]=1
    对于ll中的l:
    压力=[0]*(n+1)
    对于u,v在l中:
    压力[v]+=prev[u]
    prev=pres
    tot=0
    对于范围(1,n+1)内的i:
    tot+=上一个[i]
    打印(“到达{}的方法数为{}”。格式(i,prev[i]))
    打印(“总计:{}”。格式(tot))
    
    我希望解决办法是明确的,因为这只是我先前所说的话的反映

    输入/输出:

    对于给定的输入:

    ll = [
        [(1, 2), (3, 3), (7, 5)],
        [(2, 3), (3, 2), (6, 4), (2, 4)]
    ]
    
    输出为:

    The number of ways to reach 1 is 0
    The number of ways to reach 2 is 1
    The number of ways to reach 3 is 1
    The number of ways to reach 4 is 1
    The number of ways to reach 5 is 0
    The number of ways to reach 6 is 0
    The number of ways to reach 7 is 0
    total: 3
    

    这个解决方案的复杂性是
    O(n*k)
    ,其中
    n
    是节点数,
    k
    是子列表数。

    你不能使用
    (2,3)、(3,2)
    ,对吗?每个子列表中有一对?@MarkMoretto否。它是子列表中的一对。我喜欢把它想象成街道上车道上的节点,人们必须穿过街道,只能向前跳。试试看:
    [f{x},{y}表示成对的x[0]表示成对的y[I]如果x[1]==y[0]
    。或者,如果不能使用f字符串,
    [[x,y]表示成对x[0]表示成对y[i]如果x[1]==y[0]]
    这是f字符串。TBH,我没有真正看到Python2.7标记,但它只是每个子列表中的一对。@MarkMoretto它如何扩展到2个以上sublists@nii75435eoopy,它解决了你的问题吗
    tot
    变量包含您要查找的答案…它包含有效可能路径的总数。。。
    If there is a pair (u, v), then, pres_ways[v] += prev_ways[u].
    Here, "pres_ways[x]" denotes, present level's ways of reaching "any node x"
    and   "prev_ways[x]" denotes, previous level's ways of reaching "any node x"
    
    ll = [
        [(1, 2), (3, 3), (7, 5)],
        [(2, 3), (3, 2), (6, 4), (2, 4)]
    ]
    
    The number of ways to reach 1 is 0
    The number of ways to reach 2 is 1
    The number of ways to reach 3 is 1
    The number of ways to reach 4 is 1
    The number of ways to reach 5 is 0
    The number of ways to reach 6 is 0
    The number of ways to reach 7 is 0
    total: 3