2017-02-13 3 views
-3

Я ищу наиболее эффективную реализацию поиска дерева в python. Я даю дереву поиск последовательности длины n, и он должен обнаружить, если ветви уже созданы, или если это не так, сгенерируйте ветви.Python - Поиск дерева

Пример:

i1: Последовательность 1 [0.89,0.43,0.28]

 0.89 check 
     | 
     0.43 check 
     | 
     0.28 check(last branch, last number of sequence == found) 

i2: Последовательность 2 [0.89,0.43,0.99]

 0.89 check 
     | 
     0.43 check 
     |           | 
     0.28 missing(Creating new branch)   0.99 

Важно учитывать порядок в последовательности.

Целью является отслеживание огромного диапазона последовательности (видимого, невидимого).

Есть идеи?

+0

[heapq] (https://docs.python.org/3.5/library/heapq.html) может быть полезно. Он работает с упорядоченными списками для реализации двоичного дерева. – aluriak

ответ

0

Для этого можно использовать бесконечно вложенный collections.defaultdict. Следующая функция создаст defaultdict, что всякий раз, когда запрашиваемого значения нет, вы снова вызовете ту же функцию, создав еще один defaultdict, до бесконечности.

import collections 
nested = lambda: collections.defaultdict(nested) 
dic = nested() 

Теперь вы можете добавить последовательности к вложенному defaultdict. Вы можете сделать это в цикле или рекурсивно, или просто использовать reduce:

s1 = [0.89,0.43,0.28] 
s2 = [0.89,0.43,0.99] 

from functools import reduce # Python 3 
reduce(lambda d, x: d[x], s1, dic) 
reduce(lambda d, x: d[x], s2, dic) 

После dic выглядит следующим образом: (На самом деле, это выглядит немного по-другому, но это только из-за defaultdict также печать функции его был создан с.)

{0.89: {0.43: {0.28: {}, 0.99: {}}}} 

Если на «порядок последовательностей является важным» вы имеете в виду порядок, в котором добавляются последовательности, а не порядок в пределах последовательностей , вместо этого вам придется использовать collections.OrderedDict. В этом случае добавление новых элементов немного более активно, но не намного.

dic = collections.OrderedDict() 

def putall(d, s): 
    for x in s: 
     if x not in d: 
      d[x] = collections.OrderedDict() 
     d = d[x] 

putall(dic, s1) 
putall(dic, s2) 
+0

Привет Тобиас, хорошее решение. Как я могу увидеть, был ли создан новый defaultdict из-за последовательности ввода, в которой были новые значения? И как я могу удалить существующие defaultdicts? – abcdef123e

+0

@ abcdef123e Используя defaultdict, вы не можете действительно узнать (помимо углубленного сравнения состояний до и после обновления). Но, используя второй метод, вы можете легко установить флаг 'bool' в' True', когда была обработана ветка 'if x not in d' и вернула ее в конце. Об удалении элементов/ветвей: 'del dic [a] [b] [c]' должен работать нормально. –

+0

Решение OrderedDict было бы очень приятно, если бы рассмотрел порядок в последовательности. Мне нужно что-то подобное, но с возможностью отслеживать порядок последовательностей, чтобы функция могла сказать: «Я видел именно эту последовательность х раз раньше». Кто-нибудь имеет представление о том, как это сделать? – abcdef123e

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