# 大数据处理 - Trie树/数据库/倒排索引

\[TOC]

## 1. Trie树

> Trie树的介绍和实现请参考 [树 - 前缀树(Trie)](https://www.pdai.tech/md/algorithm/alg-basic-tree-trie.html)

* `适用范围`: 数据量大，重复多，但是数据种类小可以放入内存
* `基本原理及要点`: 实现方式，节点孩子的表示方式
* `扩展`: 压缩实现。

**一些适用场景**：

* 寻找**热门查询**: 查询串的**重复度比较高**，虽然总数是1千万，但如果除去重复后，不超过3百万个，每个不超过255字节。
* 有10个文件，每个文件1G，每个文件的每一行都存放的是用户的query，每个文件的**query都可能重复**。要你按照query的频度排序。
* 1000万字符串，其中有些是相同的(**重复**),需要把重复的全部去掉，保留没有重复的字符串。请问怎么设计和实现?
* 一个文本文件，大约有一万行，每行一个词，要求统计出其中**最频繁出现**的前10个词。其解决方法是: 用trie树统计每个词出现的次数，时间复杂度是O(n\*le)(le表示单词的平准长度)，然后是找出出现最频繁的前10个词。

## 2. 数据库索引

> 数据库索引相关，可以参看 [MySQL - 索引(B+树)](https://www.pdai.tech/md/db/sql-mysql/sql-mysql-b-tree.html)

* `适用范围`: 大数据量的增删改查
* `基本原理及要点`: 利用数据的设计实现方法，对海量数据的增删改查进行处理。

## 3. 倒排索引(Inverted index)

> 倒排索引，可以参看 ElsaticSearch底层的实现。

* `适用范围`: 搜索引擎，关键字查询
* `基本原理及要点`: 为何叫倒排索引? 一种索引方法，被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例，下面是要被索引的文本：

```
T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"
// 我们就能得到下面的倒排索引: 
"a":      {2}
"banana": {2}
"is":     {0, 1, 2}
"it":     {0, 1, 2}
"what":   {0, 1}
// 检索的条件"what","is"和"it"将对应集合的交集。
```

正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中，文档占据了中心的位置，每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词，而**倒排索引则是单词指向了包含它的文档，很容易看到这个反向的关系**。

## 4. 参考

* <https://www.pdai.tech/md/algorithm/alg-domain-bigdata-db-index.html>
