How to create a trie in Python

后端 未结 12 1480
别那么骄傲
别那么骄傲 2020-11-22 12:39

I\'m interested in tries and DAWGs (direct acyclic word graph) and I\'ve been reading a lot about them but I don\'t understand what should the output trie or DAWG file look

12条回答
  •  我在风中等你
    2020-11-22 13:22

    If you want a TRIE implemented as a Python class, here is something I wrote after reading about them:

    class Trie:
    
        def __init__(self):
            self.__final = False
            self.__nodes = {}
    
        def __repr__(self):
            return 'Trie'.format(len(self), self.__final)
    
        def __getstate__(self):
            return self.__final, self.__nodes
    
        def __setstate__(self, state):
            self.__final, self.__nodes = state
    
        def __len__(self):
            return len(self.__nodes)
    
        def __bool__(self):
            return self.__final
    
        def __contains__(self, array):
            try:
                return self[array]
            except KeyError:
                return False
    
        def __iter__(self):
            yield self
            for node in self.__nodes.values():
                yield from node
    
        def __getitem__(self, array):
            return self.__get(array, False)
    
        def create(self, array):
            self.__get(array, True).__final = True
    
        def read(self):
            yield from self.__read([])
    
        def update(self, array):
            self[array].__final = True
    
        def delete(self, array):
            self[array].__final = False
    
        def prune(self):
            for key, value in tuple(self.__nodes.items()):
                if not value.prune():
                    del self.__nodes[key]
            if not len(self):
                self.delete([])
            return self
    
        def __get(self, array, create):
            if array:
                head, *tail = array
                if create and head not in self.__nodes:
                    self.__nodes[head] = Trie()
                return self.__nodes[head].__get(tail, create)
            return self
    
        def __read(self, name):
            if self.__final:
                yield name
            for key, value in self.__nodes.items():
                yield from value.__read(name + [key])
    

提交回复
热议问题