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…
	
	Add table
		Add a link
		
	
		Reference in a new issue