the structures examples data and algorithms python algorithm

structures - github python examples



Trie tree match performance en búsqueda de palabras (1)

No veo nada malo de la parte Trie en tu código.

Pero creo que el diseño original del trie ya ha regresado pronto al detectar cualquier desajuste.

En realidad, usualmente solo uso dict regular como trie en lugar de defaultDict + TrieNode para evitar que el problema se complique demasiado. Solo necesita configurar una tecla "#" si un determinado nodo es una palabra válida. Y, durante la inserción, simplemente haga el node[w] = {} .

Si hace esto, su código puede simplificarse significativamente y la devolución temprana será sencilla, ya que no tendrá una clave "incorrecta" en un nodo.

Por ejemplo, un trie simple que contenga solo ''ab'' se verá así: {''a'': {''b'': {''#'': {}}} . Por lo tanto, cuando busque ''cd'' , tan pronto como se dé cuenta de que no hay una clave ''c'' en el dictado más externo, puede devolver false. Esta implementación es similar a la suya, pero creo que es más fácil de entender.

He depurado algunas soluciones similares, pero me pregunto si podríamos mejorar Trie Tree a un prefijo de coincidencia parcial (en el método de búsqueda de la clase Trie, el método de búsqueda actual solo verifica si una palabra completa coincide o no) para mejorar el rendimiento, lo que podría volver de un camino equivocado antes? No tengo mucha confianza en la idea, así que busque consejo antes.

Publico una de las soluciones similares. Gracias.

Dado un tablero 2D y una lista de palabras del diccionario, encuentra todas las palabras en el tablero.

Cada palabra debe construirse a partir de letras de celdas secuencialmente adyacentes, donde las celdas "adyacentes" son las vecinas horizontal o verticalmente. La misma celda de letra no puede usarse más de una vez en una palabra.

Por ejemplo, Dadas palabras = ["oath","pea","eat","rain"] y tabla =

[ [''o'',''a'',''a'',''n''], [''e'',''t'',''a'',''e''], [''i'',''h'',''k'',''r''], [''i'',''f'',''l'',''v''] ]

Regresar ["comer", "juramento"]

class TrieNode(): def __init__(self): self.children = collections.defaultdict(TrieNode) self.isWord = False class Trie(): def __init__(self): self.root = TrieNode() def insert(self, word): node = self.root for w in word: node = node.children[w] node.isWord = True def search(self, word): node = self.root for w in word: node = node.children.get(w) if not node: return False return node.isWord class Solution(object): def findWords(self, board, words): res = [] trie = Trie() node = trie.root for w in words: trie.insert(w) for i in xrange(len(board)): for j in xrange(len(board[0])): self.dfs(board, node, i, j, "", res) return res def dfs(self, board, node, i, j, path, res): if node.isWord: res.append(path) node.isWord = False if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]): return tmp = board[i][j] node = node.children.get(tmp) if not node: return board[i][j] = "#" self.dfs(board, node, i+1, j, path+tmp, res) self.dfs(board, node, i-1, j, path+tmp, res) self.dfs(board, node, i, j-1, path+tmp, res) self.dfs(board, node, i, j+1, path+tmp, res) board[i][j] = tmp