Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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_Algorithm_Tree_Tuples - Fatal编程技术网

在元组Python中查找模式

在元组Python中查找模式,python,algorithm,tree,tuples,Python,Algorithm,Tree,Tuples,我将整数对存储在元组中(例如(1,2)(4,5)…)。这些元组存储在一个列表中 我试图找到,在这些元组中,这种模式(1,2)(2,3)(3,4)(4,1),它以任何整数开始,然后从元组的第二个整数跳到另一个元组的第一个整数,以开始时拾取的整数结束 每个图案都存储在一个集合中。然后,我将第一个整数和相关模式存储为键/值对。在我的例子中,它变成:dictionary={1:set([1,2,3,4]),…} 然后,我合并具有共同项的模式。例如,(1,2)(2,3)(3,1)和(2,4)(4,1)被合

我将整数对存储在元组中(例如
(1,2)(4,5)…
)。这些元组存储在一个列表中

我试图找到,在这些元组中,这种模式
(1,2)(2,3)(3,4)(4,1)
,它以任何整数开始,然后从元组的第二个整数跳到另一个元组的第一个整数,以开始时拾取的整数结束

每个图案都存储在一个集合中。然后,我将第一个整数和相关模式存储为键/值对。在我的例子中,它变成:
dictionary={1:set([1,2,3,4]),…}

然后,我合并具有共同项的模式。例如,
(1,2)(2,3)(3,1)
(2,4)(4,1)
被合并到这个集合中:集合([1,2,3,4])。我删除了其中一把钥匙

这是我的密码:

from collections import defaultdict
dictio_chaine=defaultdict(set)
for item1 in A:               # A is the list containing the afore mentioned tuples
    a,b=item1
    l=[a,b]
    for item2 in A:
        if item2[0]==b and b!=a:
            b=item2[1]
            l.append(b)
        if b==a:
            break
    if l[-1]==a:
        dictio_chaine[a].update(l)

liste=combinations(dictio_chaine.iterkeys(),2)  #The following piece of code merges the
for item in liste:                                            #overlapping patterns.
    if item[0] in dictio_chaine and item[1] in dictio_chaine:
        if dictio_chaine[item[0]]&dictio_chaine[item[1]]:
            dictio_chaine[item[0]].update(dictio_chaine[item[1]])
            del dictio_chaine[item[1]]
我面临以下问题:我的算法的第一部分,即在元组列表中查找模式,非常糟糕,因为它的性能是O(n^2)

我认为最好是创建一棵树。模式
(1,2)(2,3)(3,1)
变成
2是1的孩子,3是2的孩子…

然后,如果遇到模式
(2,5)(5,2)
,它将成为一个新的分支5,它是2的子级,而2已经是1的子级。最后,我将合并到一组分支中,这些分支具有与第一个节点相同的叶子

这样会更好吗?我怎么能实现这样一棵树呢?因为我唯一能轻松实现的树就是一棵二叉树,它根本不适合我要做的事情


你有什么建议可以帮助我改进我的算法吗?

如果我理解这个问题,你是在有向图中寻找简单的圈

换句话说,可以将元组(如(4,5))解释为表示节点4和节点5之间的有向边。然后,您将尝试查找一条路径,该路径从一个节点开始,沿着多条边,然后返回到起始节点

您可以使用Python库中的函数轻松地实现这一点。比如说,

>>> import networkx as nx
>>> G = nx.DiGraph([(0, 0), (0, 1), (0, 2), (1, 2), (2, 0), (2, 1), (2, 2)])
>>> list(nx.simple_cycles(G))
[[2], [2, 1], [2, 0], [2, 0, 1], [0]]
对于n个节点、e条边和c条边,时间复杂度为O((n+e)(c+1)) 基本电路


就是这样。我仍然可以合并重叠列表,因为,事实上,我正在尝试用以下等价关系构建等价类:x~y iff(x,y)和(x,y)在列表中(就图而言,iff在x和y之间存在一个简单的循环),看看与强连接组件相关的库函数。特别是,您可能正试图计算图形的长度。@Raphael|LK我认为您没有等价关系,因为它缺少属性。@mitchus它是等价关系,因为我没有告诉您,(x,y)代表P(y | x)=1。否则我会同意你的