Tries树(转载)

标签: 杂谈 |

已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串。下面对比3种方法:
1.
2.
3.
解释一下hash为什么不能将建立与查询同时执行,例如有串:911,911456输入,如果要同时执行建立与查询,过程就是查询911,没有,然后存入9、91、911,查询911456,没有然后存入9114、91145、911456,而程序没有记忆功能,并不知道911在输入数据中出现过。所以用hash必须先存入所有子串,然后for循环查询。
而trie树便可以,存入911后,已经记录911为出现的字符串,在存入911456的过程中就能发现而输出答案;倒过来亦可以,先存入911456,在存入911时,当指针指向最后一个1时,程序会发现这个1已经存在,说明911必定是某个字符串的前缀,
trie树的简单实现:
#include
using
const
int
struct
{
10
11
12
13
14
15
16};
17
18class
19{
20public:
21
22
23
24
25private:
26
27};
28
29Trie::Trie()
30{
31
32}
33
34void
35{
36
37
38
39
40
41
42
43
44
45
46
47
48}
49
50bool
51{
52
53
54
55
56
57
58
59}
60
61void
62{
63
64
65
66
67
68
69
70
71}
72
73void
74{
75
76
77
78
79
80
81
82
83}
部分内容转自http://www.cnblogs.com/cherish_yimi/archive/2009/10/12/1581666.html