feat: add prefix tree implementation
This commit is contained in:
parent
4ae433d404
commit
9835c53a1e
2 changed files with 121 additions and 0 deletions
63
prefix_tree/fruits.txt
Normal file
63
prefix_tree/fruits.txt
Normal file
|
@ -0,0 +1,63 @@
|
|||
apple
|
||||
apricot
|
||||
avocado
|
||||
banana
|
||||
berry
|
||||
blackberry
|
||||
blood orange
|
||||
blueberry
|
||||
boysenberry
|
||||
breadfruit
|
||||
cantaloupe
|
||||
cherry
|
||||
citron
|
||||
citrus
|
||||
coconut
|
||||
crabapple
|
||||
cranberry
|
||||
current
|
||||
date
|
||||
dragon fruit
|
||||
durian
|
||||
elderberry
|
||||
fig
|
||||
grape
|
||||
grapefruit
|
||||
guava
|
||||
honeydew
|
||||
jackfruit
|
||||
kiwi
|
||||
kumquat
|
||||
lemon
|
||||
lime
|
||||
lingonberry
|
||||
loquat
|
||||
lychee
|
||||
mandarin orange
|
||||
mango
|
||||
marionberry
|
||||
melon
|
||||
mulberry
|
||||
nectarine
|
||||
orange
|
||||
papaya
|
||||
passion fruit
|
||||
peach
|
||||
pear
|
||||
persimmon
|
||||
pineapple
|
||||
plantain
|
||||
plum
|
||||
pluot
|
||||
pomegranate
|
||||
pomelo
|
||||
prune
|
||||
quince
|
||||
raisin
|
||||
raspberry
|
||||
star fruit
|
||||
strawberry
|
||||
tangelo
|
||||
tangerine
|
||||
ugli fruit
|
||||
watermelon
|
58
prefix_tree/prefix_tree.py
Normal file
58
prefix_tree/prefix_tree.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Example of a prefix tree implementation in python
|
||||
# Trie data-structure implementation
|
||||
# https://en.wikipedia.org/wiki/Trie
|
||||
# original date: 2021-12-03
|
||||
|
||||
import fileinput
|
||||
|
||||
def load_from_stdin():
|
||||
inp = fileinput.input()
|
||||
words = []
|
||||
for line in inp:
|
||||
word = line.strip()
|
||||
# non case sensitive
|
||||
words.append(word.lower())
|
||||
return words
|
||||
|
||||
# create the trie data structure
|
||||
def build_trie(words):
|
||||
if words == []:
|
||||
return {}
|
||||
nodes = {}
|
||||
for w in words:
|
||||
if w[0] not in nodes:
|
||||
nodes[w[0]] = []
|
||||
if len(w[1:]) > 0:
|
||||
nodes[w[0]].append(w[1:])
|
||||
for letter in nodes:
|
||||
nodes[letter] = build_trie(nodes[letter])
|
||||
return nodes
|
||||
|
||||
def get_sub_tree(nodes, pattern):
|
||||
if pattern == '': return nodes
|
||||
if pattern[0] not in nodes: return {}
|
||||
return get_sub_tree(nodes[pattern[0]], pattern[1:])
|
||||
|
||||
def get_strings(nodes):
|
||||
words = []
|
||||
for k in nodes.keys():
|
||||
if nodes[k] == {}:
|
||||
words += [ k ]
|
||||
else:
|
||||
res = get_strings(nodes[k])
|
||||
words += [ k + x for x in res]
|
||||
return words
|
||||
|
||||
def search_in_trie(nodes, pattern):
|
||||
nodes = get_sub_tree(nodes, pattern)
|
||||
words = get_strings(nodes)
|
||||
return [ pattern + x for x in words ]
|
||||
|
||||
def main():
|
||||
words = load_from_stdin()
|
||||
res = build_trie(words)
|
||||
# test matching prefix "ma"
|
||||
sugg = search_in_trie(res, 'ap')
|
||||
print(sugg)
|
||||
|
||||
main()
|
Loading…
Reference in a new issue