我正在尝试用一个朴素的构建算法编写后缀树类,该算法是O(m ^ 2)而不是Ukkonen。
我怀疑如何代表树。到目前为止,我有这个。但我不认为这是节点和边的写类结构。关于如何维护节点和边缘之间的映射/关系的任何建议。重要的一点是,在边缘我们只存储起始和结束索引以节省空间。
class suffixTree{
Node[] nodes;
Edge[] edge;
}
class Node{
int node_id;
Edge[] outgoingEdges;
}
class Edge{
int start_index;
int end_index;
int start_node_id;
int end_node_id;
}
答案 0 :(得分:3)
我会这样做:
class SuffixTree {
// A tree only needs to know about the root Node.
Node root;
}
// A Node contains a mapping from the first character to
// an Edge that corresponds to it.
// It doesn't need to know about anything else.
class Node {
Map<Character, Edge> edgeMap;
}
// An Edge contains only the start and the end index of the substring
// and the destination Node.
class Edge {
int startIndex;
int endIndex;
Node destination;
}
最重要的变化是:
摆脱所有三个班级的冗余信息。
使用引用而不是数组和索引。