Re-implement suffix_tree function

Create a suffix tree from an input string. This implementation uses a stack to
control the flow of the program.

I expected this attempt to be easier than my first attempt, but surprisingly, it
was similarly difficult. It took me ~30-45 minutes to successfully implement
this function, and I'm still not pleased with the final result.
This commit is contained in:
William Carroll 2020-11-19 21:12:36 +00:00
parent 1088e4143d
commit fa717e8a6f

View file

@ -1,4 +1,5 @@
import random import random
from collections import deque
def exists(pattern, tree): def exists(pattern, tree):
""" """
@ -42,6 +43,34 @@ def suffix_tree(xs):
parent = children parent = children
return root return root
def suffix_tree(x):
"""
Creates a suffix from the input string, `x`. This implementation uses a
stack.
"""
result = [None, []]
q = deque()
for i in range(len(x)):
q.append((result, x[i:]))
while q:
parent, x = q.popleft()
s = []
s.append((parent, x))
while s:
parent, x = s.pop()
if not x:
continue
c, rest = x[0], x[1:]
grafted = False
for child in parent[1]:
if c == child[0]:
s.append((child, rest))
grafted = True
if not grafted:
child = [c, []]
parent[1].append(child)
s.append((child, rest))
return result[1]
################################################################################ ################################################################################
# Tests # Tests