大数据处理算法
- 格式:doc
- 大小:122.50 KB
- 文档页数:16
大数据最常用的算法有哪些大数据处理涵盖了各种不同的算法和技术,下面是一些常用的大数据算法:1. 分布式存储与处理算法:用于处理海量数据的分布式存储与处理算法,如Hadoop分布式文件系统(HDFS)和Hadoop MapReduce。
2. 数据挖掘算法:用于发现大规模数据集中的模式和关联规则的算法,如Apriori算法、FP-growth算法、k-means算法、DBSCAN算法等。
3.机器学习算法:用于训练模型并进行数据分类、回归、聚类等任务的算法,如朴素贝叶斯算法、决策树算法、随机森林算法、支持向量机算法、神经网络算法等。
4. 图计算算法:用于分析图数据结构的算法,如PageRank算法、BFS算法、SSSP算法等。
5.文本挖掘与自然语言处理算法:用于处理和分析文本数据的算法,如文本分类、情感分析、命名实体识别、关键词提取等。
6.推荐系统算法:用于根据用户历史行为和兴趣进行商品或内容推荐的算法,如协同过滤算法、内容推荐算法、混合推荐算法等。
7. 关联规则挖掘算法:用于发现频繁项集和关联规则的算法,如Apriori算法、FP-growth算法等。
8.时间序列分析算法:用于分析时间序列数据的算法,如ARIMA模型、GARCH模型等。
9.异常检测算法:用于检测和识别异常数据的算法,如孤立森林算法、LOF算法等。
10.数据压缩与降维算法:用于对大规模数据进行压缩和降维的算法,如PCA算法、LLE算法等。
11.网络分析算法:用于分析和挖掘网络结构和社交网络数据的算法,如图论中的社区发现算法、中心性指标计算算法等。
12.模式识别算法:用于从大规模数据中识别和分类模式的算法,如聚类算法、支持向量机算法等。
这些算法的选择取决于具体的应用场景和问题要求,通常需要综合考虑算法的效率、准确性、可扩展性等因素。
大数据常用的算法标题:大数据常用的算法引言概述:随着信息时代的到来,大数据已经成为了各行各业的重要组成部份。
在处理大数据时,算法起着至关重要的作用。
本文将介绍大数据常用的算法,匡助读者更好地了解大数据处理过程中常用的算法。
一、聚类算法1.1 K均值算法:K均值算法是一种常用的聚类算法,通过将数据点分配到K 个不同的簇中,使得每一个数据点与其所在簇的中心点的距离最小化。
1.2 DBSCAN算法:DBSCAN算法是一种基于密度的聚类算法,能够发现任意形状的簇。
该算法通过定义核心点、边界点和噪声点来进行聚类。
1.3 层次聚类算法:层次聚类算法是一种树状聚类方法,通过逐步合并最相似的簇来构建聚类树,从而得到不同层次的聚类结果。
二、分类算法2.1 决策树算法:决策树算法是一种常用的分类算法,通过构建树状结构来表示不同类别之间的关系。
该算法易于理解和解释,适合于各种类型的数据。
2.2 支持向量机算法:支持向量机算法是一种二分类模型,通过构建最大间隔超平面来实现分类。
该算法在处理高维数据和非线性数据方面表现出色。
2.3 朴素贝叶斯算法:朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,通过假设特征之间相互独立来简化计算。
该算法在文本分类等领域有着广泛的应用。
三、回归算法3.1 线性回归算法:线性回归算法是一种用于建立变量之间线性关系的回归分析方法。
该算法通过最小化残差平方和来找到最佳拟合直线。
3.2 逻辑回归算法:逻辑回归算法是一种用于处理二分类问题的回归算法,通过将线性回归结果映射到0和1之间来实现分类。
3.3 随机森林算法:随机森林算法是一种集成学习算法,通过构建多个决策树来实现回归和分类任务。
该算法在处理大数据和高维数据时表现出色。
四、关联规则算法4.1 Apriori算法:Apriori算法是一种用于发现频繁项集的关联规则算法,通过逐层搜索频繁项集来发现数据中的关联规则。
4.2 FP-growth算法:FP-growth算法是一种用于挖掘频繁项集的关联规则算法,通过构建FP树来高效地发现频繁项集。
大数据常用的算法大数据时代的到来,给数据分析和处理带来了巨大的挑战。
为了更好地处理大规模的数据集,人们开发了许多常用的算法。
这些算法在大数据领域发挥着重要作用,能够帮助人们从海量数据中提取有价值的信息。
一、数据预处理算法1. 数据清洗算法:数据清洗是指对原始数据进行去除噪声、修复缺失值、处理异常值等操作的过程。
常用的数据清洗算法有离群值检测、缺失值插补、重复值处理等。
2. 特征选择算法:特征选择是指从原始数据中选择出最具有代表性和重要性的特征,以减少数据集的维度和复杂度。
常用的特征选择算法有信息增益、卡方检验、相关系数等。
3. 特征转换算法:特征转换是将原始数据转换为更适合建模的形式,常用的特征转换算法有主成分分析(PCA)、线性判别分析(LDA)等。
二、数据挖掘算法1. 关联规则挖掘算法:关联规则挖掘是指从大规模数据集中发现项集之间的关联关系。
常用的关联规则挖掘算法有Apriori算法、FP-Growth算法等。
2. 分类算法:分类是指将数据集中的样本划分到不同的类别中。
常用的分类算法有决策树、支持向量机(SVM)、朴素贝叶斯等。
3. 聚类算法:聚类是指将数据集中的样本划分为若干个类别,使得同一类别内的样本相似度较高,不同类别之间的样本相似度较低。
常用的聚类算法有K-means算法、DBSCAN算法等。
4. 预测算法:预测是指根据已有的数据,通过建立模型来预测未来的结果。
常用的预测算法有线性回归、逻辑回归、神经网络等。
三、数据处理算法1. 排序算法:排序是指将数据集中的元素按照一定的规则进行排列的过程。
常用的排序算法有冒泡排序、快速排序、归并排序等。
2. 查找算法:查找是指在数据集中查找指定元素的过程。
常用的查找算法有二分查找、哈希查找等。
3. 图算法:图算法是指在图结构上进行操作和计算的算法。
常用的图算法有最短路径算法、最小生成树算法等。
四、机器学习算法1. 监督学习算法:监督学习是指从有标签的训练数据中学习出一个模型,然后用该模型对新样本进行预测。
十大经典大数据算法大数据算法是指应用于大规模数据集的算法,旨在从这些数据中提取有价值的信息和洞察力。
下面是十大经典大数据算法的介绍:1. MapReduce算法:MapReduce是一种用于处理大规模数据集的编程模型,它将任务分成多个子任务并在分布式计算环境中并行执行。
这种算法在Google的大数据处理框架Hadoop中得到广泛应用。
2. PageRank算法:PageRank是一种用于评估网页重要性的算法,通过分析网页之间的链接关系来确定网页的排名。
它在谷歌搜索引擎的排名算法中起到了重要作用。
3. Apriori算法:Apriori算法用于挖掘关联规则,通过发现数据集中的频繁项集来识别项目之间的关联。
该算法在市场篮子分析和推荐系统中有广泛应用。
4. k-means算法:k-means算法是一种聚类算法,用于将数据集划分为k个不重叠的簇。
该算法在数据挖掘和图像分析中常用于聚类分析。
5. 随机森林算法:随机森林是一种集成学习算法,通过构建多个决策树并对它们的结果进行投票来进行分类或回归。
该算法在数据挖掘和机器学习中常用于分类和预测问题。
6. SVM算法:支持向量机(SVM)是一种监督学习算法,用于进行分类和回归分析。
它通过构建一个最优的超平面来将不同类别的样本分开。
7. LDA算法:潜在狄利克雷分配(LDA)是一种用于主题建模的生成模型,用于从文本数据中发现隐藏的主题结构。
该算法在自然语言处理和信息检索中有广泛应用。
8. 特征选择算法:特征选择是一种用于从数据集中选择最相关特征的方法。
常用的特征选择算法包括信息增益、卡方检验和互信息等。
9. 随机梯度下降算法:随机梯度下降是一种用于优化模型参数的迭代优化算法。
该算法通过计算损失函数的梯度来更新模型参数,从而最小化损失函数。
10. 奇异值分解算法:奇异值分解(SVD)是一种矩阵分解方法,用于降低数据维度和提取数据的主要特征。
该算法在推荐系统和图像处理中常用于降维和特征提取。
大数据常用的算法在大数据时代,处理海量数据的需求日益增长。
为了更高效地处理和分析这些数据,大数据算法应运而生。
本文将介绍几种常用的大数据算法,包括朴素贝叶斯算法、K均值算法、随机森林算法和支持向量机算法。
一、朴素贝叶斯算法朴素贝叶斯算法是一种基于贝叶斯定理的分类算法。
它假设样本特征之间相互独立,通过计算给定特征下某个类别的概率来进行分类。
朴素贝叶斯算法在文本分类、垃圾邮件过滤等领域有广泛应用。
例如,我们可以使用朴素贝叶斯算法来判断一封邮件是否为垃圾邮件。
通过对邮件中的词语进行统计,计算出给定某些词语的情况下,该邮件为垃圾邮件的概率。
根据概率大小,我们可以将邮件分类为垃圾邮件或者非垃圾邮件。
二、K均值算法K均值算法是一种聚类算法,用于将数据集划分为K个不同的簇。
它通过计算数据点与簇中心的距离,并将数据点分配给距离最近的簇来实现聚类。
K均值算法在图象分割、客户细分等领域有广泛应用。
例如,我们可以使用K均值算法将一组学生按照成绩划分为不同的等级。
通过计算每一个学生与不同等级的平均成绩之间的距离,将学生分配到最近的等级中。
三、随机森林算法随机森林算法是一种集成学习算法,通过构建多个决策树来进行分类或者回归。
每一个决策树的结果投票决定最终的分类结果。
随机森林算法在图象识别、金融风控等领域有广泛应用。
例如,我们可以使用随机森林算法来预测一辆二手车的价格。
通过构建多个决策树,每一个决策树根据不同的特征对车辆进行分类,最终通过投票得出预测的价格区间。
四、支持向量机算法支持向量机算法是一种二分类算法,通过构建超平面将数据点划分为两个类别。
它通过最大化两个类别之间的间隔来实现分类。
支持向量机算法在文本分类、图象识别等领域有广泛应用。
例如,我们可以使用支持向量机算法来判断一封邮件是否为垃圾邮件。
通过将邮件中的特征转化为向量表示,构建超平面将垃圾邮件和非垃圾邮件分开。
综上所述,朴素贝叶斯算法、K均值算法、随机森林算法和支持向量机算法是大数据处理中常用的算法。
大数据常用的算法一、介绍在大数据时代,海量的数据对我们来说是一项巨大的财富,但如何从这些数据中提取有价值的信息却是一项挑战。
大数据算法是用于处理和分析大规模数据集的数学和统计方法。
它们帮助我们从海量数据中发现模式、提取特征、进行预测和优化等。
本文将介绍几种常用的大数据算法及其应用。
二、常用的大数据算法1. K均值聚类算法K均值聚类算法是一种常用的无监督学习算法,用于将数据集分成K个不相交的簇。
该算法通过计算数据点与聚类中心之间的距离来确定数据点所属的簇。
它在大数据分析中被广泛用于图像分割、文本聚类和推荐系统等领域。
2. 决策树算法决策树算法是一种基于树结构的分类和回归方法。
它通过对数据集进行递归划分,构建一个树形模型来进行预测。
决策树算法具有可解释性强、易于理解和实现的特点,在金融风险评估、医疗诊断和客户分类等领域有广泛应用。
3. 支持向量机算法支持向量机算法是一种二分类模型,通过在高维空间中构建超平面来实现分类。
它通过最大化分类边界的间隔来提高模型的鲁棒性和泛化能力。
支持向量机算法在文本分类、图像识别和网络入侵检测等领域具有良好的效果。
4. 随机森林算法随机森林算法是一种集成学习方法,它结合了多个决策树模型来进行分类和回归。
随机森林算法通过随机选择特征和样本来减少模型的方差,提高模型的泛化能力。
它在金融风控、信用评分和销售预测等领域有广泛应用。
5. 神经网络算法神经网络算法是一种模拟人脑神经元工作方式的机器学习算法。
它通过构建多层神经元网络来进行学习和预测。
神经网络算法具有强大的拟合能力和非线性建模能力,在图像识别、自然语言处理和语音识别等领域取得了重要突破。
三、大数据算法的应用案例1. 电商推荐系统电商推荐系统利用大数据算法分析用户的历史购买记录、浏览行为和个人偏好,为用户推荐个性化的商品。
通过使用K均值聚类算法和协同过滤算法,电商平台可以更好地理解用户需求,提高销售量和用户满意度。
2. 智能交通管理智能交通管理利用大数据算法分析交通流量、车辆位置和道路状况,优化交通信号灯控制和路线规划。
大数据处理中使用的常见算法和技术大数据处理是指利用计算机技术来处理大量、高速产生和不断积累的数据的一系列技术。
随着互联网的迅猛发展,数据已经成为了我们生活中不可或缺的一部分。
而这些海量数据的处理,需要一系列算法和技术的支持。
一、MapReduce算法MapReduce算法是一种用于大数据处理的分布式计算框架,是Google公司开发的。
其基本思想是将原始数据分为若干个分片,然后由每台计算机单独处理对应分片的数据,最后将处理后的结果合并在一起。
这种处理方式可以大大提高数据的处理效率和处理能力。
二、Hadoop技术Hadoop技术是一个开源的分布式计算框架,是Apache软件基金会所开发的。
它由Hadoop分布式文件系统(HDFS)和MapReduce两个主要模块组成。
通过Hadoop技术,用户可以简单地管理自己的数据,并利用MapReduce算法来进行处理。
三、机器学习技术机器学习技术是一种能够根据数据自我学习的技术,可以为数据的预测和模式发现提供支持。
通过机器学习技术,用户可以对大量的数据进行分类、聚类、分类和预测等处理,并获得有价值的信息。
四、神经网络技术神经网络技术是一种仿照生物神经系统的信息处理技术,是机器学习技术中的一项重要内容。
神经网络技术可以模拟人类的大脑,通过自我学习,可以对数据进行分类、聚类和预测等处理。
在大数据处理中,神经网络技术可以发现数据中的隐含关系和模式,为决策提供有价值的支持。
五、Spark技术Spark技术是一种开源的分布式计算框架,是Apache软件基金会所开发的。
它可以在不同的计算框架中使用,包括Hadoop、Mesos和Stand-alone等。
Spark技术的主要特点是速度高,可以在内存中进行计算,从而提高大数据处理的速度和效率。
六、数据挖掘技术数据挖掘技术是一种通过数据分析和处理,来发现潜在的关系和模式的技术。
它可以对大量数据进行分类、聚类、分类和预测等处理,并发现其中潜在的规律和趋势,为企业决策提供有价值的支持。
大数据常用的算法一、介绍在大数据时代,海量的数据需要被有效地处理和分析,以发现其中的模式、关联和趋势。
为了实现这一目标,大数据算法应运而生。
大数据算法是一系列用于处理大规模数据集的数学和统计方法,它们能够帮助我们从海量数据中提取有价值的信息。
本文将介绍几种常用的大数据算法及其应用。
二、K均值聚类算法K均值聚类算法是一种无监督学习算法,它将数据集划分为K个不重叠的簇。
该算法的基本思想是:首先随机选择K个中心点,然后计算每个样本与中心点的距离,并将样本分配给距离最近的中心点所在的簇。
接下来,更新每个簇的中心点,并重复上述步骤,直到簇的中心点不再发生变化或达到预定的迭代次数。
K均值聚类算法的应用非常广泛,例如在市场细分中,可以将客户按照其购买行为和偏好划分为不同的群体;在图像处理中,可以将像素点按照颜色相似度进行聚类,从而实现图像分割等。
三、朴素贝叶斯算法朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立性假设的分类算法。
该算法通过计算给定特征条件下不同类别的概率,从而判断新样本属于哪个类别。
朴素贝叶斯算法的应用十分广泛,特别适用于文本分类。
例如,在垃圾邮件过滤中,可以根据邮件的特征(如关键词、发件人等)判断邮件是否为垃圾邮件。
四、决策树算法决策树算法是一种基于树形结构的分类和回归算法。
该算法通过构建一棵决策树,将数据集划分为不同的子集,直到达到预定的停止条件。
决策树的每个内部节点表示一个特征,每个叶节点表示一个类别或回归值。
决策树算法的优势在于可以直观地解释分类过程,并且对于缺失数据和异常数据有一定的鲁棒性。
它在金融风险评估、医学诊断等领域有着广泛的应用。
五、支持向量机算法支持向量机算法是一种二分类算法,其目标是找到一个最优的超平面,将不同类别的样本分开。
该算法的核心思想是通过最大化样本点到超平面的间隔,找到一个最优的分类边界。
支持向量机算法具有较好的泛化能力和鲁棒性,适用于高维空间和非线性分类问题。
大数据常用的算法在当今数字化时代,大数据已经成为企业决策和发展的重要支撑。
而在处理大数据时,算法起着至关重要的作用。
本文将介绍大数据常用的算法,匡助读者更好地了解和应用这些算法。
一、分类算法1.1 决策树算法:通过树状结构对数据进行分类和预测,易于理解和解释。
1.2 支持向量机算法:通过寻觅最佳的超平面将数据分类,适合于高维数据和非线性数据。
1.3 朴素贝叶斯算法:基于贝叶斯定理,假设特征之间相互独立,适合于文本分类和垃圾邮件过滤等场景。
二、聚类算法2.1 K均值算法:通过不断迭代更新质心来将数据聚类成不同的簇,适合于数据量较大的场景。
2.2 DBSCAN算法:基于密度的聚类算法,能够发现任意形状的簇,对噪声数据具有较好的鲁棒性。
2.3 层次聚类算法:通过不断合并最相似的簇来构建聚类层次,可以根据需求选择不同的聚类粒度。
三、关联规则算法3.1 Apriori算法:通过挖掘频繁项集和关联规则来发现数据中的潜在关系,适合于市场篮子分析和推荐系统。
3.2 FP-growth算法:通过构建FP树来高效地发现频繁项集,减少了对数据的多次扫描。
3.3 Eclat算法:基于垂直数据表示的频繁项集挖掘算法,适合于处理稀疏数据集。
四、回归算法4.1 线性回归算法:通过拟合一条直线来描述自变量和因变量之间的关系,适合于连续型数据的预测。
4.2 逻辑回归算法:用于解决分类问题,将线性回归模型的输出映射到一个概率范围内。
4.3 决策树回归算法:通过构建回归树来预测连续型数据,易于解释和可视化。
五、降维算法5.1 主成份分析(PCA)算法:通过线性变换将原始数据映射到低维空间,保留最慷慨差的信息。
5.2 t-SNE算法:通过优化局部和全局结构来实现高维数据的可视化。
5.3 LDA算法:用于降维和特征选择,通过最大化类间距离和最小化类内距离来实现数据的判别。
总结:大数据常用的算法涵盖了分类、聚类、关联规则、回归和降维等多个领域,每种算法都有其独特的应用场景和优势。
大数据常用的算法引言概述:随着信息技术的发展,大数据已经成为了当今社会的热门话题。
大数据的处理和分析需要借助各种算法来提取有价值的信息。
本文将介绍大数据常用的算法,包括聚类分析、关联规则挖掘、分类算法、回归分析和推荐系统算法。
一、聚类分析:1.1 K-means算法:K-means是一种常用的聚类算法,它将数据集分成K个簇,每个簇都有一个代表性的中心点。
该算法通过迭代计算,将数据点分配到最近的簇中,并更新簇的中心点,直到达到收敛条件。
1.2 DBSCAN算法:DBSCAN是一种基于密度的聚类算法,它通过定义邻域半径和最小邻居数来划分簇。
该算法将密度相连的数据点划分为一个簇,并通过扩展核心对象的方式逐渐扩展簇的大小。
1.3 层次聚类算法:层次聚类是一种自底向上或自顶向下的聚类方式。
该算法通过计算数据点之间的相似度或距离来构建聚类树或聚类图,最终将数据点划分为不同的簇。
二、关联规则挖掘:2.1 Apriori算法:Apriori算法是一种挖掘频繁项集和关联规则的经典算法。
该算法通过迭代计算,生成候选项集,并通过剪枝策略来减少计算量。
最终,Apriori 算法可以找到频繁项集和关联规则。
2.2 FP-growth算法:FP-growth算法是一种基于前缀树的关联规则挖掘算法。
该算法通过构建FP树来表示数据集,并利用频繁模式的特性来高效地挖掘关联规则。
2.3 Eclat算法:Eclat算法是一种基于垂直数据格式的关联规则挖掘算法。
该算法通过交易数据库的交易项集来构建倒排索引表,并利用倒排索引表来高效地挖掘频繁项集和关联规则。
三、分类算法:3.1 决策树算法:决策树是一种基于树结构的分类算法。
该算法通过对数据集进行递归划分,构建一个树状模型,用于预测新数据的分类。
常用的决策树算法包括ID3、C4.5和CART。
3.2 支持向量机算法:支持向量机是一种二分类的线性分类算法,它通过在特征空间中构建一个超平面来进行分类。
大数据处理算法目录大数据处理算法一:Bitmap算法 (2)大数据处理算法二:Bloom Filter算法 (5)大数据处理算法三:分而治之/hash映射 + hash统计 + 堆/快速/归并排序 (11)标签:算法,大数据,编程,面试题,腾讯大数据处理算法一:Bitmap算法腾讯面试题:给20亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中并且所耗内存尽可能的少?解析:bitmap算法就好办多了所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。
通常是用来判断某个数据存不存在的。
例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。
那么就可以开一个int数组,一个int有32个位,就可以表示32个人。
操作的时候可以使用位操作。
一,申请512M的内存一个bit位代表一个unsigned int值读入20亿个数,设置相应的bit位读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在二、使用位图法判断整形数组是否存在重复判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。
位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上1,如遇到 5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。
这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。
它的运算次数最坏的情况为2N。
如果已知数组的最大值即能事先给新数组定长的话效率还能提高一倍。
1.import java.util.BitSet;2./**3.* 大数据处理算法一,bitmap算法4.* @author JYC5065.*6.*/7.public class Bitmap {8.9.byte[] tem;10.11.public Bitmap(int length) {12.this.tem = new byte[length];13.}14.15.public void add(int num) {16.if (num < tem.length) {17.if (tem[num] != 1) {18.tem[num] = 1;19.}20.}21.}22.23.public boolean contain(int num) {24.if (num < tem.length) {25.if (tem[num] == 1) {26.return true;27.}28.}29.return false;30.}31.32.public static void main(String[] args) {33./*运行前内存*/34.long beforeMemory = Runtime.getRuntime().totalMemory();35.long start1=System.currentTimeMillis();36.BitSet set = new BitSet(2000000000);37.for (int i = 0; i < 2000000000; i++) {38./*假设898989这个数不在20亿个数里面*/39.if (i != 898989) {40.set.set(i, true);41.}42.}43./*创建20亿个数后所占内存*/44.long afterMemory = Runtime.getRuntime().totalMemory();45.long end1=System.currentTimeMillis();46.System.out.println("总共内存使用:" + (afterMemory - beforeMemory) / 1024 / 1024 +"MB");47.System.out.println("存入内存耗时:"+(end1-start1)+"毫秒");48.long start2 = System.currentTimeMillis();49.boolean isExit1=set.get(898989);50.boolean isExit2=set.get(900000);51.52.long end2 = System.currentTimeMillis();53./*输出在20亿个数中判断898989是否包含在里面*/54.System.out.println(isExit1);55.System.out.println("20个亿中"+(isExit1?"包含":"不包含")+898989);56.System.out.println("20个亿中"+(isExit2?"包含":"不包含")+900000);57.System.out.println("查询用时:"+(end2 - start2)+"毫秒");58.}59.60.}大数据处理算法二:Bloom Filter算法百度面试题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。
通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。
一. 实例为了说明Bloom Filter存在的重要意义,举一个实例:(实例一),假设要你写一个网络蜘蛛(web crawler)。
由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。
为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。
给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,(实例二)给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?就会有如下几种方案:1. 将访问过的URL保存到数据库。
2. 用HashSet将访问过的URL保存起来。
那只需接近O(1)的代价就可以查到一个URL是否被访问过了。
3. URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。
4. Bit-Map方法。
建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。
方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。
以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。
方法1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。
而且每来一个URL就启动一次数据库查询是不是太小题大做了?方法2的缺点:太消耗内存。
随着URL的增多,占用的内存会越来越多。
就算只有1亿个URL,每个URL只算50个字符,就需要5GB内存。
方法3:由于字符串经过MD5处理后的信息摘要长度只有128Bit,SHA-1处理后也只有160Bit,因此方法3比方法2节省了好几倍的内存。
方法4消耗内存是相对较少的,但缺点是单一哈希函数发生冲突的概率太高。
还记得数据结构课上学过的Hash表冲突的各种解决方法么?若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。
实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!也就是说少量url实际上没有没网络蜘蛛访问,而将它们错判为已访问的代价是很小的——大不了少抓几个网页呗。
例如有一组字符arr:”哈哈“,”呵呵“........字符串:“哈哈”哈希算法1处理后:8哈希算法2处理后:1哈希算法1处理后:3插入BitArray后再处理字符串:“呵呵”哈希算法1处理后:2哈希算法2处理后:1哈希算法1处理后:9继续插入BitArray后,如果继续游字符串,继续以这种方式插入判断”在这些字符串是否包含”嘻嘻“哈希算法1处理后:0哈希算法2处理后:1哈希算法1处理后:7只要判断下标分别为0,1,7位置的值是否都为1,如下图因为位置0跟位置7的值不为1所以”嘻嘻“不包含在arr中,反之如果都为1怎包含java代码实现如下1.import java.util.ArrayList;2.import java.util.BitSet;3.import java.util.List;4.5./**6.* BloomFilter算法7.*8.* @author JYC5069.*10.*/11.public class BloomFilter {12./*哈希函数*/13.private List<IHashFunction> hashFuctionList;14./*构造方法*/15.public BloomFilter() {16.this.hashFuctionList = new ArrayList<IHashFunction>();17.}18./*添加哈希函数类*/19.public void addHashFunction(IHashFunction hashFunction) {20.this.hashFuctionList.add(hashFunction);21.}22./*删除hash函数*/23.public void removeHashFunction(IHashFunction hashFunction) {24.this.hashFuctionList.remove(hashFunction);25.}26./*判断是否被包含*/27.public boolean contain(BitSet bitSet, String str) {28.for (IHashFunction hash : hashFuctionList) {29.int hashCode = hash.toHashCode(str);30.if(hashCode<0){31.hashCode=-hashCode;32.}33.if (bitSet.get(hashCode) == false) {34.return false;35.}36.}37.return true;38.}39./*添加到bitSet*/40.public void toBitSet(BitSet bitSet, String str) {41.for (IHashFunction hash : hashFuctionList) {42.int hashCode = hash.toHashCode(str);43.if(hashCode<0){44.hashCode=-hashCode;45.}46.bitSet.set(hashCode, true);47.}48.}49.50.public static void main(String[] args) {51.BloomFilter bloomFilter=new BloomFilter();52./*添加3个哈希函数*/53.bloomFilter.addHashFunction(new JavaHash());54.bloomFilter.addHashFunction(new RSHash());55.bloomFilter.addHashFunction(new SDBMHash());56./*长度为2的24次方*/57.BitSet bitSet=new BitSet(1<<25);58./*判断test1很test2重复的字符串*/59.String[] test1=new String[]{"哈哈","我","大家","逗比","有钱人性","小米","Iphone","helloWorld"};60.for (String str1 : test1) {61.bloomFilter.toBitSet(bitSet, str1);62.}63.String[] test2=new String[]{"哈哈","我的","大家","逗比","有钱的人性","小米","Iphone6s","helloWorld"};64.for (String str2 : test2) {65.if(bloomFilter.contain(bitSet, str2)){66.System.out.println("'"+str2+"'是重复的");67.}68.}69.70.}71.}72./*哈希函数接口*/73.interface IHashFunction {74.int toHashCode(String str);75.}76.77.class JavaHash implements IHashFunction {78.79.@Override80.public int toHashCode(String str) {81.return str.hashCode();82.}83.84.}85.86.class RSHash implements IHashFunction {87.88.@Override89.public int toHashCode(String str) {90.int b = 378551;91.int a = 63689;92.int hash = 0;93.for (int i = 0; i < str.length(); i++) {94.hash = hash * a + str.charAt(i);95.a = a * b;96.}97.return hash;98.}99.100.}101.102.class SDBMHash implements IHashFunction {103.104.@Override105.public int toHashCode(String str) {106.int hash = 0;107.for (int i = 0; i < str.length(); i++)108.hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash; 109.return hash;110.}111.112.}大数据处理算法三:分而治之/hash映射 + hash统计 + 堆/快速/归并排序百度面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。