在元组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。否则我会同意你的