def insert(self, str, docID):
     char = str[0]
     rest = str[1:]
     if str == "":
         raise Exception("Empty string not allowed as key")
     if char in self._keyList:
         ind = self._keyList.index(char)
         self._nodeList[ind].insert(rest, docID)
         return
     else:
         node = TrieNode(char)
         self._nodeList.append(node)
         self._keyList.append(char)
         node.insert(rest, docID)
         return
示例#2
0
    def insert(self, key):
        cur = self.root

        for c in key:
            found = False
            for node in cur.children:
                if node.data == c:
                    cur = node
                    found = True
            if not found:
                new_node = TrieNode(c)
                cur.children.append(new_node)
                cur = new_node

        cur.is_end = True
示例#3
0
 def add_text_nodes(self, node_children, text, data):
     if len(text) > 0:
         target_node = None
         if text[0] in node_children:
             target_node = node_children[text[0]]
         else:
             new_node = TrieNode()
             if text[0] in self.node_map:
                 self.node_map[text[0]].append(new_node)
             else:
                 self.node_map[text[0]] = []
                 self.node_map[text[0]].append(new_node)
             node_children[text[0]] = new_node
             target_node = new_node
         if len(text) > 1:
             self.add_text_nodes(target_node.children, text[1:], data)
         else:
             target_node.add_data(data)
示例#4
0
文件: trie.py 项目: e184633/educative
    def insert(self, key):
        # None keys are not allowed
        if key is None:
            return

        key = key.lower()  # Keys are stored in lowercase
        current_node = self.root

        # Iterate the trie with the given character index,
        # If the index points to None
        # simply create a TrieNode and go down a level
        for level in range(len(key)):
            index = self.get_index(key[level])

            if current_node.children[index] is None:
                current_node.children[index] = TrieNode(key[level])
                print(key[level] + " inserted")

            current_node = current_node.children[index]

        # Mark the end character as leaf node
        current_node.mark_as_leaf()
        print("'" + key + "' inserted")
示例#5
0
 def __init__(self) -> None:
     self.root = TrieNode('\0')
from trie_node import TrieNode

forbidden_words = [
    'darn', 'rats', 'egg', 'fuzzy', 'kthx', 'haha', 'ugh', '777', 'cheese',
    'i', 'l', 'o', '0', '1'
]

forbidden_words_trie = TrieNode('', False, True)
for word in forbidden_words:
    forbidden_words_trie.insert(word.upper())
示例#7
0
 def __init__(self):
     self.root = TrieNode(None, None)
     self.size = 0
示例#8
0
class Trie:

    __slots__ = 'root', 'size'

    def __init__(self):
        self.root = TrieNode(None, None)
        self.size = 0

    def insert(self, entry):
        node = self.root
        for letter in entry.headword.lower():
            child = node.children[letter]
            if child:
                node = child
            else:
                node = node.insert_child(letter)
        node.entries.append(entry)
        self.size += 1

    def get_node(self, word):
        node = self.root
        for letter in word.lower():
            node = node.children[letter]
            if node == None:
                return None
        return node

    def search(self, word, case_sensitive):
        node = self.get_node(word)
        if node == None or len(node.entries) == 0:
            return []
        if case_sensitive:
            entries = []
            for entry in node.entries:
                if entry.headword == word:
                    entries.append(entry)
            return entries
        else:
            return node.entries.copy()

    def remove(self, word, case_sensitive):
        node = self.get_node(word)
        if node == None or len(node.entries) == 0:
            return
        if case_sensitive:
            i = 0
            while i < len(node.entries):
                if node.entries[i].headword == word:
                    del node.entries[i]
                    self.size -= 1
                else:
                    i += 1
        else:
            self.size -= len(node.entries)
            del node.entries[:]
        while len(node.child_keys) == 0 and len(node.entries) == 0:
            letter = node.letter
            node = node.parent
            if node == None:
                break
            node.remove_child(letter)

    def get_neighbors(self, word, radius):
        node = self.get_node(word)
        if node == None:
            raise WordNotFound(word)
        predecessors = []
        count = 0
        neighbor = node.previous_node()
        while neighbor and count < radius:
            if len(neighbor.entries) > 0:
                predecessors.append(neighbor.get_lower_word())
                count += 1
            neighbor = neighbor.previous_node()
        successors = []
        count = 0
        neighbor = node.next_node()
        while neighbor and count < radius:
            if len(neighbor.entries) > 0:
                successors.append(neighbor.get_lower_word())
                count += 1
            neighbor = neighbor.next_node()
        return predecessors, successors

    def match_prefix(self, prefix, case_sensitive):
        node = self.get_node(prefix)
        if node == None:
            return
        if case_sensitive:
            yielded = set()
            for entry in node.values():
                word = entry.headword
                if word.startswith(prefix) and word not in yielded:
                    yield word
                    yielded.add(word)
        else:
            yield from node.keys()

    def load(self, file_name):
        stream = open(file_name, 'r')
        for line in stream:
            line = line.strip()
            if line == '':
                continue
            try:
                entry = DictEntry.from_line(line)
            except InvalidSyntax as exception:
                print(exception)
            else:
                self.insert(entry)
        stream.close()

    def write(self, file_name):
        stream = open(file_name, 'w')
        for entry in self.root.values():
            entry.write(stream)
        stream.close()
示例#9
0
 def __init__(self):
     self.root = TrieNode(None)
     self.count = 0
示例#10
0
    def bfs_traversal(self):
        if self.root == None:
            return False

        print(self.root.value)
        queue = deque()
        for index in self.root.children:
            queue.append(self.root.children[index])

        while len(queue) > 0:
            val = queue.pop()
            print(val.value)
            for child in val.children:
                queue.append(val.children[child])

        return True


if __name__ == "__main__":
    var = Trie()
    # var.root = TrieNode(1)
    # print(var.root.value)
    val = TrieNode(1)
    val.add_child(2)
    val.children[2].add_child(6)
    val.children[2].children[6].add_child(7)
    val.add_child(3)
    var.root = val
    var.dfs_traversal_print()
    print("_____")
    var.bfs_traversal()
示例#11
0
文件: trie.py 项目: e184633/educative
 def __init__(self):
     self.root = TrieNode()  # Root node