Вопрос

Оглядываясь за реализацию Python попыток, чтобы я мог понять, что они есть и как они работают, я наткнулся на Джастин Пила Патриция Три. И нашел его очень поучительно: это достаточно просто для одного, как я нового, как я собираюсь играть с ним и учиться у него.

Однако я думаю, что я не понимаю:

Использование класса Джастина Patricia () Таким образом:

>>> p = patricia()
>>> words = ['foo','bar','baz']
>>> for x in words:
...     p.addWord(x)

Я получаю TRIE как словарь, выглядящий так:

>>> p._d
{'b': ['a', {'r': ['', {}], 'z': ['', {}]}], 'f': ['oo', {}]}

ADDWORD () и ISWORD () Работа, как ожидалось, но ISPrefix () показывает следующее поведение, которое загадывает меня:

>>> p.isPrefix('b')
True
>>> p.isPrefix('f')
True
>>> p.isPrefix('e')
False

хорошо, как и ожидалось; а потом

>>> p.isPrefix('ba')
True

Также хорошо, но тогда:

>>> p.isPrefix('bal')
True

и, кроме того:

>>> p.isPrefix('ballance')
True
>>> p.isPrefix('ballancing act')
True

Что-то здесь я не понимаю?

Это было полезно?

Решение

Я верю, что ошибка в следующем фрассетере кода, на которую вы смотрите:

       if w.startswith(node[0][:wlen-i],i):
            if wlen - i > len(node[0]):
                i += len(node[0])
                d = node[1]
            return True

На самом деле должно быть:

       if w.startswith(node[0][:wlen-i],i):
            if wlen - i > len(node[0]):
                i += len(node[0])
                d = node[1]
            else:
                return True
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top