屏蔽字检测 Trie树 及 复杂度分析

N: 屏蔽字个数。 M:表示组成屏蔽字的字符集的数量 WL:屏蔽字的最大长度 L:输入检测语句的长度
inPut: 句子:我罗是有个志向的,那天看到特朗普就揍他一顿
words: "特朗普","罗志祥","志向","揍"
relpace: ""
则M = 8, WL = 3, N = 4,L = 21
output: 我罗是有个
的,那天看到他一顿

----- 普通屏蔽字检测 -----
时间复杂度:O(L * N * WL) ex:21 * 4 * 3 = 264 100 * 300 * 3 = 90000
空间复杂度: O(1)

----- Trie树 屏蔽字检测 -----
时间复杂度: O(N * WL) + 0(L * WL) = O((N + L) *WL) ex:(21 + 4) * 3 = 75。 (100 + 300) * 3 = 1200
空间复杂度: O(WL * N * M)
由于Dict来存Node的children节点,单个字符作为key,这样子的话Dict里面不需要一开始不需要初始化成{M1:Node, M2:Node, ..., Mm:Node}
而是Dict都是空的,只有需要insert进入的时候再懒加载创建,并放进去,考虑到最极端的情况,就是N个word没有任何交叉,且长度都为最大WL,此时需要
的节点数量为:WL * N 故空间复杂度降低到 WL * N

sentence: abcdefghijklmnopqrstuvwxyz
构建一个trie树
for (int i=0; i step, match = trie.walk(i)
i += step;
if (!match) {
NSLog(@"not match:%@", s[i:i+step]);
} else {
s[i:i+step] = @"***";
}

你可能感兴趣的:(屏蔽字检测 Trie树 及 复杂度分析)