Skip to content

Commit 08326e2

Browse files
authored
Merge pull request azl397985856#524 from ToSnow/patch-2
2 parents 50fb093 + 8890827 commit 08326e2

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

Diff for: thinkings/trie.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
1313
## 基本概念
1414

15-
假想一个场景:给你若干单词 words 和一系列关键字 keywords,让你判断 keywords 是否在 words 中存在,或者判断 keywords 中的单词是否有 words 中的单词的前缀。 pre 就是 pres 的前缀**之一**
15+
假想一个场景:给你若干单词 words 和一系列关键字 keywords,让你判断 keywords 是否在 words 中存在,或者判断 keywords 中的单词是否有 words 中的单词的前缀。比如 pre 就是 pres 的前缀**之一**
1616

1717
朴素的想法是遍历 keywords,对于 keywords 中的每一项都遍历 words 列表判断二者是否相等,或者是否是其前缀。这种算法的时间复杂度是 $O(m * n)$,其中 m 为 words 的平均长度,n 为 keywords 的平均长度。那么是否有可能对其进行优化呢?答案就是本文要讲的前缀树。
1818

@@ -245,7 +245,7 @@ Trie.prototype.startsWith = function(prefix) {
245245

246246
## 回答开头的问题
247247

248-
前面我们抛出了一个问题:给你若干单词 words 和一系列关键字 keywords,让你判断 keywords 是否在 words 中存在,或者判断 keywords 中的单词是否有 words 中的单词的前缀。 pre 就是 pres 的前缀**之一**
248+
前面我们抛出了一个问题:给你若干单词 words 和一系列关键字 keywords,让你判断 keywords 是否在 words 中存在,或者判断 keywords 中的单词是否有 words 中的单词的前缀。比如 pre 就是 pres 的前缀**之一**
249249

250250
如果使用 Trie 来解,会怎么样呢?首先我们需要建立 Trie,这部分的时间复杂度是 $O(t)$,其中 t 为 words 的总字符。**预处理**完毕之后就是查询了。对于查询,由于树的高度是 $O(m)$,其中 m 为 words 的平均长度,因此查询基本操作的次数不会大于 $m$。当然查询的基本操作次数也不会大于 $k$,其中 k 为被查询单词 keyword 的长度,因此对于查询来说,时间复杂度为 $O(min(m, k))$。时间上优化的代价是空间上的消耗,对于空间来说则是预处理的消耗,空间复杂度为 $O(t)$。
251251

0 commit comments

Comments
 (0)