일반 트라이를 만들고 와일드 카드 가장자리를 추가 할 수 있습니다. 당신의 복잡성은 O (n)입니다. 여기서 n은 패턴의 길이입니다. 패턴 0에서 **
의 런을 *
으로 바꿔야합니다 (또한 O (n) 작업 임).
단어의 목록이 있다면 나는 황소가 후 트라이 조금 같을 것이다 이니
(I ($ [I])
a (m ($ [am])
n ($ [an])
? ($ [am an])
* ($ [am an]))
o (x ($ [ox])
? ($ [ox])
* ($ [ox]))
? ($ [I]
m ($ [am])
n ($ [an])
x ($ [ox])
? ($ [am an ox])
* ($ [I am an ox]
m ($ [am]) ...)
* ($ [I am an ox]
I ...
...
을 그리고 여기 샘플 파이썬 프로그램입니다 : 동의
import sys
def addWord(root, word):
add(root, word, word, '')
def add(root, word, tail, prev):
if tail == '':
addLeaf(root, word)
else:
head = tail[0]
tail2 = tail[1:]
add(addEdge(root, head), word, tail2, head)
add(addEdge(root, '?'), word, tail2, head)
if prev != '*':
for l in range(len(tail)+1):
add(addEdge(root, '*'), word, tail[l:], '*')
def addEdge(root, char):
if not root.has_key(char):
root[char] = {}
return root[char]
def addLeaf(root, word):
if not root.has_key('$'):
root['$'] = []
leaf = root['$']
if word not in leaf:
leaf.append(word)
def findWord(root, pattern):
prev = ''
for p in pattern:
if p == '*' and prev == '*':
continue
prev = p
if not root.has_key(p):
return []
root = root[p]
if not root.has_key('$'):
return []
return root['$']
def run():
print("Enter words, one per line terminate with a . on a line")
root = {}
while 1:
line = sys.stdin.readline()[:-1]
if line == '.': break
addWord(root, line)
print(repr(root))
print("Now enter search patterns. Do not use multiple sequential '*'s")
while 1:
line = sys.stdin.readline()[:-1]
if line == '.': break
print(findWord(root, line))
run()
문자열은 단어로 구성되며 단어 기반 패턴입니까? 그렇다면 초기 색인 생성 비용 (O (N))을 지불하는 경우 검색 속도를 높이는 데 사용할 수있는 정보 검색 기술이 많이 있습니다. 가장 중요한 부분은이를 위해 많은 라이브러리가 있다는 것입니다. – tucuxi
*,? 요소는 야생 (카드) 에서처럼 괄호를 사용합니까? – tucuxi