Наиболее питонический способ реализовать общую длину ребра для листовых узлов в дереве? - PullRequest
0 голосов
/ 23 ноября 2018

Каков был бы самый питонный способ реализации общей длины для листовых узлов в дереве?

В следующем примере я использую переменную класса, которая прекрасно работает, когда есть только одно дерево, но не когда их два или более (потому что переменная класса влияет на каждый Node экземпляр, а не только на экземпляры вконкретное дерево).

class _Node:
    """
    """
    _global_end = 0

    def __init__(self, start: int, size: int = 0):
        self.start: int = int(start)
        self._size: int = int(size)
        self.children: dict = {}

    def __repr__(self):
        return "Node({0.start}:{0.end})".format(self)

    @classmethod
    def _get_end(cls) -> int:
        return cls._global_end

    @classmethod
    def global_extend(cls, increment: int = 1):
        cls._global_end += increment

    @property
    def is_leaf(self) -> bool:
        return not self.children

    @property
    def end(self) -> int:
        if self.is_leaf:
            return self._get_end()
        return self.start + self._size

    @property
    def size(self) -> int:
        return self.end - self.start

    @size.setter
    def size(self, value: int):
        if self.is_leaf:
            raise AttributeError('cannot resize leaves individually')
        self._size = value

    def add_child(self, name: str, start: int, size: int = 0) -> None:
        self.children[name] = _Node(start, size)

    def set_child(self, name: str, child: '_Node') -> None:
        self.children[name] = child

Очевидно, что можно было бы создать что-то вроде объекта class End и передать его функции-конструктору Node, но это выглядит грязно, потому что структура данных Tree тогда должна будетзнать как о Node зависимости, так и о зависимости самого класса Node.

Смысл этого в том, чтобы в классе Tree был метод, который может изменять размер всех конечных узлов за O (1) времени путем изменения одной переменной.

Очевидно, что для того, чтобы дерево оставалось действительным, внутренние узлы не должны изменяться, когда листья изменяются.Кроме того, для того, чтобы существовало несколько действительных деревьев (каждое из которых составлено из групп связанных узлов), должна быть возможность работать с каждым из них по отдельности, не влияя на другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...