diff --git a/pre.md b/pre.md index fbe830a..053a89e 100644 --- a/pre.md +++ b/pre.md @@ -58,6 +58,7 @@ SVM 学好python +http://julyedu.com/course/getDetail?course_id=34#discard julyedu 课程大纲 ### 数据挖掘 diff --git a/二叉树/README.md b/二叉树/README.md index 55d5555..9a4f03e 100644 --- a/二叉树/README.md +++ b/二叉树/README.md @@ -231,7 +231,7 @@ trie,又称为前缀树或字典树,是一种有序树,用于保存关联 ### trie树存储结构和基本操作 -最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符) +最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符如=-*/) 子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 如果用链表存储,查询时需要遍历链表,查询效率有所降低 @@ -249,8 +249,7 @@ int Trie_delete(Trie *trie,char *word);// 删除一个单词 ``` -trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定 - +trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定。 DATrie libdatrie 双数组可以减少内存的使用量 @@ -269,17 +268,22 @@ double-array trie 参考作者的这篇论文 http://linux.thai.net/~thep/datri 查询效率比hash table 更优?? +trie 树比较费内存空间,在处理大数据时会内存吃紧 + + +知乎这里有个问题:`10万个串找给定的串是否存在`, 对trie合适hash给出了讨论。 http://www.zhihu.com/question/27168319 + ### trie应用 -典型应用是:前缀查询 , 字符串查询,排序 - -用于统计,排序和保存大量的字符串(但不仅限于字符串) -经常被搜索引擎系统用于文本词频统计 -排序大量字符串 -用于索引结构 -敏感词过滤 +典型应用是:前缀查询,字符串查询,排序 +* 用于统计,排序和保存大量的字符串(但不仅限于字符串) +* 经常被搜索引擎系统用于文本词频统计 +* 排序大量字符串 +* 用于索引结构 +* 敏感词过滤 + ### 实际应用问题 1. 给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置 分析思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。 diff --git a/海量数据处理/README.md b/海量数据处理/README.md index 22cdd4d..e8d26a4 100644 --- a/海量数据处理/README.md +++ b/海量数据处理/README.md @@ -3,10 +3,24 @@ 所谓海量数据,就是数据量太大,要么在短时间内无法计算出结果,要么数据太大,无法一次性装入内存。 -针对时间,我们可以使用巧妙的算法搭配合适的数据结构,如bitmap/堆/trie树等 +针对时间,我们可以使用巧妙的算法搭配合适的数据结构,如bitmap/堆/trie树等 针对空间,就一个办法,大而化小,分而治之。常采用hash映射 +### 估算 + +在处理海量问题之前,我们往往要先估算下数据量,能否一次性载入内存?如果不能,应该用什么方式拆分成小块以后映射进内存?每次拆分的大小多少合适?以及在不同方案下,大概需要的内存空间和计算时间。 + +比如,我们来了解下以下常见问题`时间` 和 `空间` 估算 : + +``` +8位的电话号码,最多有99 999 999个 +IP地址 + + +``` + + 海量处理问题常用的分析解决问题的思路是: * 分而治之/Hash映射 + hash统计/trie树/红黑树/二叉搜索树 + 堆排序/快速排序/归并排序 @@ -17,25 +31,19 @@ * 分布处理之 Hadoop/Mapreduce -### 估算 - -在处理海量问题之前,我们往往要先估算下数据量,能否一次性载入内存?如果不能,应该用什么方式拆分成小块以后映射进内存?每次拆分的大小多少合适? - -以及在不同方案下,大概需要的内存空间和计算时间。也就是估算时间 和 空间 。比如: - -``` -8位的电话号码,最多有99 999 999个 -IP地址 - - -``` - ### 分而治之/Hash映射 -这里的`Hash映射`是指通过一种映射散列的方式,将数据均匀分布在对应的内存或更小的文件中 +这里的`Hash映射`是指通过一种映射散列的方式,将海量数据均匀分布在对应的内存或更小的文件中 -使用hash映射有个最重要的特点是: `hash值相同的两个串不一定一样,但是两个一样的字符串hash值一定相等` +使用hash映射有个最重要的特点是: `hash值相同的两个串不一定一样,但是两个一样的字符串hash值一定相等`。哈希函数如下: + +``` +int hash = 0; +for (int i=0;i