#python #algorithm #data-structures #binary-tree #nested-loops
#питон #алгоритм #структуры данных #двоичное дерево #вложенные циклы
Вопрос:
Я выполняю задачу по кодированию, в которой я должен найти уровень узла в двоичном дереве кортежей, если он существует. Мое решение неэффективно и работает только для узлов низкого уровня. Как оптимизировать код для работы на очень больших уровнях?
Шаблон генерации кортежей находится в классе узлов.
Например, решение («4», «7») вернет 4, а решение(«2», «1») вернет 1
from itertools import product class Node: def __init__(self,data): self.data = data self.left = (self.data[0] self.data[1], self.data[1]) self.right = (self.data[0], self.data[0] self.data[1]) def lefts(self): self.data = self.left def rights(self): self.data = self.right def getter(self): return self.data def solution(x,y): tup = (int(x),int(y)) a = ['left', 'right'] directions = list(product(a,repeat=int(max(tup)))) for direction in directions: node = Node((1,1)) count = 0 for lor in direction: if node.getter() == tup: return count if lor == 'left': node.lefts() node = Node(node.getter()) else: node.rights() node = Node(node.getter()) count = 1 return 'impossible'
Комментарии:
1. Каковы входные данные? Можете ли вы добавить примеры входов и соответствующих выходов?
2. Отвечаете ли вы за построение дерева или вам необходимо использовать определенный класс дерева? Также: существует ли только один запрос или несколько запросов с одним и тем же деревом?
Ответ №1:
Для этой проблемы на самом деле создавать двоичное дерево-излишество.
Более того, лучше взглянуть на проблему в противоположном направлении, т. е. начать с данного (x,y) «узла» и определить, каким будет его родитель, а затем повторить этот шаг, чтобы перейти к корню.
Это более интересно, так как узел имеет только одного родителя, и поэтому не нужно рассматривать никаких альтернатив. Если этот путь ведет к узлу (1, 1), то мы нашли решение. Если, однако, путь ведет к кортежу, член которого не является строго положительным, то мы можем сделать вывод, что решения нет… по-видимому, узел является членом отдельного дерева.
«Формула» для получения родительского узла (x, y) является
- (x, y — x) когда y gt; x
- (x — y, y) в противном случае
Основываясь на этих наблюдениях, программа довольно проста:
def solution(x, y): count = 0 while x gt; 1 and y gt; 1: if x gt; y: x -= y else: y -= x count = 1 return count abs(x - y) if min(x, y) == 1 else "impossible"
Комментарии:
1. Это ответ на ваш вопрос?