目录
一、Hash法
使用Hash方法一般可以快速存取、统计某些数据,将大量数据进行分类
1、Hash法
Hash一般被翻译为哈希,也被称为散列,它是一种映射关系,即给定一个数据元素,其关键字为key,按一个确定的哈希函数Hash计算出Hash(key),把hash(key)作为关键字key对应元素的存储地址(或称哈希地址),再进行数据元素的插入和检索操作。
简而言之,哈希函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
哈希表是具有固定大小地数组,其中,表长(即数组的大小)应该为质数
2、哈希函数一般具有的特点(3)
(1)运算应该尽可能简单
(2)函数的值域必须在散列表的范围内
(3)尽可能地减少冲突
3、常用哈希函数的构建方法(7)
(1)直接寻址法
h(key) = key 或 h(key) = a*key+b //a,b均为整型常数
(2)取模法
hash(Key) = Key mod p //p一般为TableSize,即哈希表的长度
(3)数字分析法
设关键字:d位以r为基的数,且共有n个关键字
(4)折叠法
(5)平方取中法
(6)除留余数法
Hash(Key) = Key % p //p<=TableSize,且接近TableSize,或等于TableSize
p一般选取质数,也可以是不包含小于20质因子的合数
(7)随机数法
Hash(Key) = random(key) //random()为随机函数
关键字长度不相等时采用这种方法比较合适
4、哈希冲突解决方法(4)
冲突是指两个关键字映射到同一存储地址的情况,即对不同的关键字可能得到同一散列地址,即key1不等于key2,而f(key1)=f(key2)
解决冲突的主要途径是当一个关键字映射到哈希表中的某一个地址且该地址已有关键字时,再为该关键字寻找新的存储地址
常用的冲突解决办法:
(1)开放地址法
基本思想:当发生地址冲突时,在哈希表中按照某种方法继续探测其他的存储地址,直到找到空闲的地址为止
Hi(key) = (H(key) + di)mod m (i = 1,2,3,……,k (k<=m-1))
其中,(H(key)为关键字key的直接哈希地址;m为哈希表的长度;di为每次再探测时的地址增量
(2)链地址法
主要思想:如果哈希表空间为[0,m-1],则设置一个由m个指针组成的一维数组CH[m],然后在寻找关键字哈希地址的过程中,所有的哈希地址为i的数据元素都插入到头指针为CH[i]的链表中
这种方法适用于冲突比较严重的情况下使用
(3)再散列法
(4)建立一个公共溢出区
二、Bit-map法
1、适用于海量数据的快速查找、判重、删除等
2、基本原理:使用位数组来表示某些元素是否存在
3、时间复杂度为O(n),以空间换时间(需要一个N位的串)
三、Bloom filter法
1、一种空间效率和时间效率很高的随机数据结构,用来检测一个元素是否属于一个集合
2、以牺牲正确率为前提,来换取时间效率和空间效率的提高
3、适用于对于低级错误可以容忍的场合
4、基本原理:位数组与Hash函数的联合使用
5、优点:具有很哈的时间效率和空间效率。它的插入和查询时间都是常数,另外它不保存元素本身,具有良好的安全性
6、Bloom filter只能插入元素,不能删除元素
7、可以实现数据字典、进行数据的判重或者集合求交集
四、数据库优化法
1、数据库优化方法(12)
(1)优秀的数据库管理工具
Oracle、DB2、MySQL
(2)数据分区
有效地存储并降低需要处理的数据规模,进行分区操作可以提高效率
(3)索引
可以加速数据的检索速度,加速表与表之间的链接,提高性能
索引需要占物理空间
(4)缓存机制
(5)加大虚存
(6)分批处理
(7)使用临时表和中间表
(8)优化查询语句
(9)使用视图
(10)使用存储过程
在存储过程中尽量使用SQL自带的返回参数,而非自定义的返回参数,减少不必要的参数,避免数据冗余
(11)用排序来取代非排序存取
(12)使用采样数据进行数据挖掘
五、倒排索引法
1、按照关键字建立索引,这个索引就被称为倒排索引法
2、搜索引擎的核心内容
3、倒排索引也常被称为反向索引、置入档案或反向档案,它本质上是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射
有两种不同的反向索引:
(1)一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表;
(2)一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置;
第二种形式提供了更多的兼容性(如短语搜索),但是需要更多的时间和空间来创建
4、文档检索系统中最常用的数据结构
5、在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说,文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向关系
6、与正向索引相比,反向索引的优点是在处理复杂的多关键字查询时,可在倒排表中先完成查询的并、交等逻辑运算,得到结果后再对记录进行存取,这样不必对每个记录随机存取,把对记录的查询转换为地址集合的运算,从而提高查找速度
7、倒排索引一般应用于文档检索系统,查询哪些文件包含了某个单词,比如常见的学术论文的关键字搜索
六、外排序法
1、当待排序的对象数目特别多时,在内存中不能一次处理,必须把他们以文件的形式存放于外存,排序时再把它们一部分一部分调入内存进行处理,这种方式就是外排序
2、一般采用归并等方式实现外排序
(1)生成若干初始归并段(顺串),也被称为文件预处理,把含有n个记录的文件,按内存大小划分成若干长度位L的子文件,然后分别将子文件调入内存,采取有效的内排序方法排序后送回外存
(2)进行多路归并,即对这些初始归并段进行多遍扫描归并,使得有序的归并段逐渐扩大,最后在外存上形成整个文件的单一归并段,此时就完成了文件的外排序
3、适用范围:大数据的排序以及去重复
4、缺陷:会消耗大量的IO,效率不会很高
七、Trie树(字典树/键数)
1、Trie来源于“retrieve”,用于快速字符串检索的多叉树结构
2、原理:利用字符串的公共前缀来降低时空开销,即以空间换时间,从而达到提高程序效率的目的
3、典型应用:统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计
4、优点:最大限度的减少无谓的字符串比较,查询效率比哈希表高
5、Trie树的三个基本特性:
(1)根结点不包含字符,除根节点外每一个结点都只包含一个字符
(2)从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串
(3)每个结点的所有子结点包含的字符都不相同
6、Trie树适用数据量大、重复多,但是数据种类小可以放入内存的情况
八、堆
1、堆是一种树形数据结构,每个结点都有一个值,而通常所说的堆,一般是指二叉堆
2、堆适用于海量数据求前N大(用小顶堆)或者前N小(用大顶堆)数问题,其中N一般比较小
描述 | 堆类型 | 作用 | |
堆 | 求海量数据中前n大/小的值中位数 | 最大堆 | 求前n小 |
最小堆 | 求前n大 | ||
双堆 | 中位数 |
3、采用堆只需要扫描一遍即可得到所有的前n元素,所以在海量信息处理中,效率非常高
九、双层桶法
1、双层桶不是一种数据结构,而是一种算法思想,类似于分治思想。因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,最后在一个可以接收的范围内进行
2、采用关键字比较的排序方法(通常用插入排序)对各个桶进行排序,然后依次将各非空桶中的记录连接起来即可
3、适用于范围较小的情况,否则所需桶的数目太多而导致浪费存储空间和计算时间
十、MapReduce法
1、MapReduce是云计算的核心技术之一,是一种简化并行计算的分布式编程模型。它为并行系统的数据处理提供了一个简单、高效的解决方案
2、主要目的:是为了大型集群的系统能在大数据集上进行并行工作,并用于大规模数据的并行运算
3、核心操作:是Map和Reduce,即MapReduce拆开为“Map(映射)”和“Reduce(化简)"。其中,Map函数独立地对每个元素进行操作,它用于把一组键值对映射成一组新的键值对,即先通过Map程序将数据切割成不相关的区块,分配(调度)给大量计算机处理达到分布计算的效果,然后通过指定并发的Reduce函数来将结果汇总,保证所有映射键值对中的每一个共享相同的键组
4、适合在集群中处理大规模数据的计算任务,这些优点使得其已经成为云计算平台的主流编程模型