经常碰到要存一堆的string, 这个时候可以用hash tables, 虽然hash tables 查找很快,但是hash tables不能表现出字符串之间的联系.可以用binary search tree, 但是查询速度不是很理想. 可以用trie, 不过trie会浪费很多空间(当然你也可以用二个数组实现也比较省空间). 所以这里Ternary Search trees 有trie的查询速度快的优点,以及binary search tree省空间的优点.
实现一个12个单词的查找
这个是用二分查找树实现,n是单词个数,len是长度,复杂度是O(logn * n),空间是n*len
这个是用trie实现,复杂度O(n), 空间是 这里是18 * 26(假设只有26个小写字符),随着单词长度的增长等,需要的空间就更多
这个是Ternary search tree, 可以看出空间复杂度和binary search tree 一样, 复杂度近似O(n),常数上会比trie差点.
介绍
Ternary search tree 有binary search tree 省空间和trie 查询快的优点.
Ternary search tree 有三个只节点,在查找的时候,比较当前字符,如果查找的字符比较小,那么就跳到左节点.如果查找的字符比较大,那么就跳转到友节点.如果这个字符正好相等,那么就走向中间节点.这个时候比较下一个字符.
比如上面的例子,要查找”ax”, 先比较”a” 和 “i”, “a” < "i",跳转到"i"的左节点, 比较 "a" < "b", 跳转到"b"的左节点, "a" = "a", 跳转到 "a"的中间节点,并且比较下一个字符"x". "x" > “s” , 跳转到”s” 的右节点, 比较 “x” > “t” 发现”t” 没有右节点了.找出结果,不存在”ax”这个字符
构造方法
这里用c语言来实现
节点定义:
typedef struct tnode *Tptr; typedef struct tnode { char s; Tptr lokid, eqkid, hikid; } Tnode;
先介绍查找的方法:
int search(char *s) // s是想要查找的字符串 { Tptr p; p = t; //t 是已经构造好的Ternary search tree 的root 节点. while (p) { if (*s < p->s) { // 如果*s 比 p->s 小, 那么节点跳到p->lokid p = p->lokid; } else if (*s > p->s) { p = p->hikid; } else { if (*(s) == '