从小长度序列中寻找序列

时间:2013-08-25 13:54:28

标签: python sequence

我想通过使用特定格式的某些事件来生成空间。让我用一个小例子来解释这个问题。

假设我有事件a,b,c,d,e,f。我将有3个长度的序列作为由这些事件组成的输入。从这些序列中我想生成6个长度(事件数)序列,序列中不会有重复的元素,即每个事件只使用一次。 6长度序列需要满足一些规则。(在例子中解释)

示例:

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['f','g','e'] 

List1描述了,b和c将出现在a之后,而c将出现在6长度序列中的b之后,即,当顺序变化序列也发生变化时。同样地,List2描述了d和e将在c之后,e将在d之后。将采用所有列表并记录规则。在从这些序列中提取所有规则之后,我需要生成符合规则的6长度序列。作为一个例子;

让我们说在我们的例子中(为简单起见)输入是List1,List2和List3

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']

然后这些列表的一些结果是;

['a','b','c','d','e']:它遵循提取这三个列表的所有规则,比如b和c来自a,d和e来自c,c和d来自b之后。来自这里的重要说明,如果c需要在a之后,它们不需要在输出序列中相邻(6长)

无法保证6长度序列始终存在。首先,需要检查是否存在至少一个这样的序列。如果不是,算法应该返回false。举个例子;假设我们的输入是Lis1,Lis2,Lis3,Lis4和Lis5。

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['e','g','b'] 

a => b => c => g => b这是不可能的,因为b不能自己来。

我需要一种算法来在Python中生成这些序列。我现在没有任何代码,因为到目前为止我无法想到任何有效的算法。它也需要非常有效地找到更长的序列。

如果问题不明确,请现在就告诉我。

谢谢

2 个答案:

答案 0 :(得分:3)

这是一个起点:

import networkx as nx
from itertools import tee, izip

list1 = ['a','b','c']
list2 = ['c','d','e']
list3 = ['b','c','d']

g = nx.DiGraph()
for items in [list1, list2, list3]:
    a, b = tee(items)
    next(b)
    g.add_edges_from(izip(a, b))

print nx.topological_sort(g)
# ['a', 'b', 'c', 'd', 'e']

如果图表包含循环,则会引发异常......

答案 1 :(得分:1)

您可以将模型构建为Directed Acyclic Graphnetworkx python库将为您处理所有图形内容。

要生成随机6个元素序列,您可以枚举所有可能的序列,然后从具有6个元素的序列中随机选择

(糟糕但有效)算法的草图:

  1. 从Jon的例子开始 - 构建图表并确保图表是DAG
  2. P是节点的向量,在开头是空的
  3. 从图表中选择一个随机节点,将节点添加到P
  4. 选择随机邻居节点
  5. 将新节点添加到P
  6. 如果P具有所需的长度(10或20或其他),那么P是有效的结果。
  7. 否则,请转到4