📜  Ukkonen的后缀树构造–第5部分(1)

📅  最后修改于: 2023-12-03 14:48:09.471000             🧑  作者: Mango

Ukkonen的后缀树构造–第5部分

在进行Ukkonen的后缀树构造时,我们已经介绍了如何构建Active Point和Edge Label,接下来我们需要考虑如何操作位置Pos。Pos指的是后缀树上的当前位置,在每次向后添加字符时,Pos都会更新。

Pos的更新规则

在添加字符时,更新Pos需要考虑以下几种情况:

  1. 如果当前位置在Edge Label的中间,则Pos直接后移一个位置即可;
  2. 如果当前位置已经到达Edge Label的结尾,则需要根据Active Point的状态进行更新;
  3. 如果当前位置指向一个节点的末尾,则需要根据Suffix Link进行更新。
def update_pos():
    global pos, active_edge, active_len, active_node 
    
    if active_len == 0:
        active_edge = pos
    
    next_char = get_active_edge_char()
    
    if text[pos] == next_char:
        active_len += 1
        pos += 1
        return
    
    if active_len > 0:
        # split edge
        split_node = create_node(active_node, active_edge, active_edge + active_len)
        add_edge(active_node, split_node, active_edge, active_edge + active_len)
        
        # create new leaf node
        leaf_node = create_node(split_node, pos, len(text))
        add_edge(split_node, leaf_node, pos, len(text))
        
        # update active point
        if active_node == root:
            active_edge += 1
            active_len -= 1
        else:
            active_node = get_suffix_link(active_node)
        
        update_pos()
        
    else:
        # create new leaf node
        leaf_node = create_node(active_node, pos, len(text))
        add_edge(active_node, leaf_node, pos, len(text))
        
        # update active point
        active_node = get_suffix_link(active_node)
        update_pos()
总结

在本篇文章中,我们介绍了如何更新位置Pos,并给出了代码实现。在下一篇文章中,我们将讨论如何添加新的后缀到后缀树中。