要写一个词典类,搜以前的帖子,看到检索树作为数据结构蛮好,可是对我来说算法太复杂了,那位大虾有检索树的C++的算法包括建树,删除和查找,能不能发个给我,万分感谢.我的email:[email protected].
还有如果不自己写算法,C++库里有没有可以用于单词检索的泛型算法可以直接用?效率如何?
检索树中的每个节点是一个字符
树根为一个特殊的空字符
从树根到树叶的一条路径就表示了一个单词。
例如,你的字典中有
abc
adfe
abef
ccd
这些单词,构成一个树,首先,树根是一个空字符,它有两个儿子a和c(因为你的字典中所有单词的开头字符只有a和c),对于节点a,他又有两个儿子b和d(因为字典中以a开头的所有单词的第二字字母只能是b和d);对于节点b,它又有两个儿子c和e,对于节点c,它已经是叶结点了,于是从根节点到叶结点c的路径#abc就构成一个单词abc,其中#表示根节点上的空字符;同理,从根节点到叶结点f的路经abef也构成一个单词……。字典中所有的单词都可以如此存储在一颗检索树中。检索树的数据结构可以递归定义如下:
TSearchTreeNode = class {
  char data;
  hash_table<TSearchTreeNode> chlidren;
}
其中data是该节点所存储的字符,children是一个哈西表,存储该节点的子节点。哈西表的主键是字符,其中存储的数据类型是TSearchTreeNode类型。这样,从一个节点出发找到具有特定字符的子节点只需要在哈西表中以O(1)的时间检索。所以,在检索树中找到一个长度为k的单词只需要进行k次比较。这已经是理论上最高的匹配效率了。
现在的各种电子字典都以检索树为数据结构,因为它的检索效率最高,而且插入删除都很容易。