Изменения

Перейти к: навигация, поиск

Алгоритм Укконена

230 байт убрано, 00:29, 21 апреля 2015
Реализация
'''int''' begin
'''int''' end
'''int''' depth // расстояние от корня до до текущей вершины в символах
'''Node''' parent
'''Node[]''' children
'''Node''' suffixLink
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
'''function''' buildSuffixTree(s):
'''int''' n = s.length()
'''byte''' a[n] '''for''' i = 0..n a[i] = indexOf(s[i]) in ALPHABET '''Node''' root = new Node(0, 0, 0, null);
'''Node''' node = root
'''int''' tail = 0
'''for''' i = 0..n
tail++ '''Node''' last = null<font color=green>// последняя созданная на текущей итерации внутренняя вершина</font>
'''while''' tail <tex>\geqslant</tex> 0
'''Node''' ch = node.children[as[i - tail]]
'''while''' ch <tex>\ne</tex> null && tail <tex>\geqslant</tex> ch.end - ch.begin
tail -= ch.end - ch.begin
node = ch
ch = ch.children[as[i - tail]]
'''if''' ch == null
node.children[as[i]] = new Node(i, n, node.depth + node.end - node.begin, node)
'''if''' last <tex>\ne</tex> null
last.suffixLink = node
last = null
'''else'''
'''byte''' t = as[ch.begin + tail] '''if''' t == as[i]
'''if''' last <tex>\ne</tex> null
last.suffixLink = node
'''break'''
'''else'''
'''Node''' splitNode = new Node(ch.begin, ch.begin + tail, node.depth + node.end - node.begin, node) splitNode.children[as[i]] = new Node(i, n, ch.depth + tail, splitNode)
splitNode.children[t] = ch
ch.begin += tail
ch.depth += tail
ch.parent = splitNode
node.children[as[i - tail]] = splitNode
'''if''' last <tex>\ne</tex> null
last.suffixLink = splitNode
'''else'''
node = node.suffixLink
tail++
'''return''' root
275
правок

Навигация