腾讯电面被问到字符串搜索的问题,当时只答出来O(n^2)级别的线性搜索.
其实trie树的概念在脑里一直有初步概念,只是没有归纳总结,一时被问到自然很难答出来.提醒自己,对于脑子里一些有初步设想的算法概念都应该在网络上找找相关知识,毕竟开源的世界里,你能想到的,总有人想得比你更远,考虑得比你更完善.
关于海量字符串数据的问题都可以用tire树解决,典型应用就是搜索框的自动联想功能. 每个结点带有的exist变量可以灵活修改以实现不同的功能.如,exist改为出现次数的统计,可以实现热门搜索词的统计排序.
对于python而言,dict就是python的hashmap.各种相关算法都应该想到dict解决.
#测试用例
#tree.add("abc")
#tree.add("bcd")
class TireTree(object):
def __init__(self):
self.tree = {}
def add(self,s):
tree = self.tree
for c in s:
#Pythonic Tips:善用dict.get()替代冗余代码
tree[c] = tree.get(c,{})
tree = tree[c]
#if c in tree:
# tree = tree[c]
#else:
# tree[c] = {}
# tree = tree[c]
tree['exist'] = True
def search(self,s):
tree = self.tree
for c in s:
if c in tree:
tree = tree[c]
else:
return False
return tree.get('exist',False)
atree = TireTree()
atree.search('abc')
False
atree.add('abc')
atree.search('abc')
True
atree.tree
{'a': {'b': {'c': {'exist': True}}}}
atree.add('bcd')
atree.search('b')
False
atree.search('bcd')
True
atree.tree
{'a': {'b': {'c': {'exist': True}}}, 'b': {'c': {'d': {'exist': True}}}}
atree.add('ab')
atree.tree
{'a': {'b': {'c': {'exist': True}, 'exist': True}},
'b': {'c': {'d': {'exist': True}}}}
atree.search('ab')
True