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:
parent
1088e4143d
commit
fa717e8a6f
1 changed files with 29 additions and 0 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue