2015-02-12 2 views
1

Прежде всего, я должен признаться, что я очень плохо отношусь к графику. Мои деревья реализованы как вложенные словари, которые представляют собой невзвешенные цепи Маркова.Сравнение двух деревьев/графиков в Python

class Tree(object): 
    def __init__(self, depth=6, seq=None): 
     self.graph = dict() 
     self.depth = depth 
     if seq is not None: 
      self.build(seq) 

    def build(self, seq): 
     for i in xrange(len(seq)): 
      sseq = seq[i:i+self.depth] 
      for j in xrange(len(sseq)): 
       if j == 0: 
        if sseq[j] not in self.graph: 
         self.graph[sseq[j]] = dict() 
        nest_pointer = self.graph[sseq[j]] 
       else: 
        if sseq[j] not in nest_pointer: 
         nest_pointer[sseq[j]] = dict() 
        nest_pointer = nest_pointer[sseq[j]] 

Что мне нужно, чтобы иметь возможность сравнить два дерева, в то же время известно о глубине, на которой происходят несходства, потому что я собираюсь использовать иерархическую систему подсчета очков сходства, поэтому простой рекурсивный DFS не делает Хитрость.

P.S.

Если вы можете предложить лучшую структуру данных для моих деревьев, я был бы очень признателен. Я пошел со словарями, чтобы получить максимальную производительность. Заранее спасибо.

+0

Относительно вас P.S. , есть много предложений по SO, которые могут помочь вам реализовать другую (я смущаюсь сказать лучше, поскольку я ее не сравнивал) структуру данных для ваших деревьев. См. [This] (http://stackoverflow.com/questions/3009935/looking-for-a-good-python-tree-data-structure), [это] (http://stackoverflow.com/questions/2482602/ a-general-tree-implementation-in-python) или [this] (http://stackoverflow.com/questions/2358045/how-can-i-implement-a-tree-in-python-are-there- any-built-in-data-structure-in? rq = 1) – Muttonchop

ответ

2

Почему вы не можете использовать рекурсивную DFS? Просто передайте текущую высоту в качестве параметра. Я не совсем уверен, как вы идете по поводу сравнения узлов или поддеревьев, но что-то подобное может работать, что просто записывает все времена, что два узла сравнения неравны (с некоторым определенным пользователем сравнению nodes_different)

(псевдокод):

def compare_trees_r(node1, node2, depth, result): 
    if nodes_different(node1, node2): 
     result.append(depth) 
    for (pairs of children c1 and c2): 
     compare_trees_r(c1, c2, depth + 1, result) 

def compare_trees(t1, t2): 
    result = [] 
    compare_trees_r(t1.graph, t2.graph, 0, result) 
    return result 

Насколько ваша фактическая структура данных идет, трудно предложить более подходящую структуру, не зная, что такое seq. Тем не менее, я настоятельно рекомендую вам создать класс для ваших узлов, что значительно облегчит рассуждения о вашем коде. Если окажется, что на самом деле это вызывает проблему производительности (после профилирования), только тогда ее оптимизируйте (прежде всего, преждевременная оптимизация - корень всего зла).

+0

Ну, это может показаться очевидным, но я не хочу добавлять аргумент глубины к стандартному алгоритму DFS. Теперь я чувствую себя глупо. В любом случае, это решает проблему. Большое спасибо. –

Смежные вопросы