37218排序算法有多少种算法

您正在使用IE低版浏览器,为了您的雷锋网账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
发私信给陈圳
导语:机器学习算法很多,包括分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,一般都是采用启发式学习方法试验。
同步到新浪微博
当月热门文章
为了您的账户安全,请
您的邮箱还未验证,完成可获20积分哟!
您的账号已经绑定,现在您可以以方便用邮箱登录
请填写申请人资料几种经典的hash算法 - CSDN博客
几种经典的hash算法
计算理论中,没有Hash函数的说法,只有单向函数的说法。所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据。用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来;而当给定结果的时候,很难计算出输入来,这就是单项函数。各种加密函 数都可以被认为是单向函数的逼近。Hash函数(或者成为散列函数)也可以看成是单向函数的一个逼近。即它接近于满足单向函数的定义。
Hash函数还有另外的含义。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制:
1.&Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。
2.&由于Hash逼近单向函数;所以,你可以用它来对数据进行加密。
3.&不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。
应用于加密的Hash函数已经探讨过太多了,在作者的博客里面有更详细的介绍。所以,本文只探讨用于查找的Hash函数。
Hash函数应用的主要对象是数组(比如,字符串),而其目标一般是一个int类型。以下我们都按照这种方式来说明。
一般的说,Hash函数可以简单的划分为如下几类:
1.&加法Hash;
2.&位运算Hash;
3.&乘法Hash;
4.&除法Hash;
5.&查表Hash;
6.&混合Hash;
下面详细的介绍以上各种方式在实际中的运用。
一 加法Hash
所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。标准的加法Hash的构造如下:
&static int additiveHash(String key, int prime)
&&int hash,
&&for (hash = key.length(), i = 0; i & key.length(); i++)
&&&hash += key.charAt(i);
&&return (hash % prime);
&这里的prime是任意的质数,看得出,结果的值域为[0,prime-1]。
二 位运算Hash
这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。比如,标准的旋转Hash的构造如下:
&static int rotatingHash(String key, int prime)
&& int hash,
&& for (hash=key.length(), i=0; i&key.length(); ++i)
&&&& hash = (hash&&4)^(hash&&28)^key.charAt(i);
&& return (hash % prime);
先移位,然后再进行各种位运算是这种类型Hash函数的主要特点。比如,以上的那段计算hash的代码还可以有如下几种变形:
1.&&&& hash = (hash&&5)^(hash&&27)^key.charAt(i);
2.&&&& hash += key.charAt(i);
&&&&&&& hash += (hash && 10);
&&&&&& &hash ^= (hash && 6);
3.&&&& if((i&1) == 0)
&&&&&&& &hash ^= (hash&&7) ^ key.charAt(i) ^ (hash&&3);
&&&&&&& else
&&&&&&&&&hash ^= ~((hash&&11) ^ key.charAt(i) ^ (hash &&5));
4.&&&& hash += (hash&&5) + key.charAt(i);
5.&&&& hash = key.charAt(i) + (hash&&6) + (hash&&16) –
6.&&&& hash ^= ((hash&&5) + key.charAt(i) + (hash&&2));
三 乘法Hash
这种类型的Hash函数利用了乘法的不相关性(乘法的这种性质,最有名的莫过于平方取头尾的随机数生成算法,虽然这种算法效果并不好)。比如,
&static int bernstein(String key)
&& int hash = 0;
&& for (i=0; i&key.length(); ++i) hash = 33*hash + key.charAt(i);
jdk5.0里面的String类的hashCode()方法也使用乘法Hash。不过,它使用的乘数是31。推荐的乘数还有:131, , 131313等等。
使用这种方式的著名Hash函数还有:
&//& 32位FNV算法
&int M_SHIFT = 0;
&&& public int FNVHash(byte[] data)
&&&&&&& int hash = (int)L;
&&&&&&& for(byte b : data)
&&&&&&&&&&& hash = (hash * ) ^
&&&&&&& if (M_SHIFT == 0)
&&&&&&&&&&&
&&&&&&& return (hash ^ (hash && M_SHIFT)) & M_MASK;
以及改进的FNV算法:
&&& public static int FNVHash1(String data)
&&&&&&& final int p = ;
&&&&&&& int hash = (int)L;
&&&&&&& for(int i=0;i&data.length();i++)
&&&&&&&&&&& hash = (hash ^ data.charAt(i)) *
&&&&&&& hash += hash && 13;
&&&&&&& hash ^= hash && 7;
&&&&&&& hash += hash && 3;
&&&&&&& hash ^= hash && 17;
&&&&&&& hash += hash && 5;
除了乘以一个固定的数,常见的还有乘以一个不断改变的数,比如:
&&& static int RSHash(String str)
&&&&&&& int b&&& = 378551;
&&&&&&& int a&&& = 63689;
&&&&&&& int hash = 0;
&&&&&& for(int i = 0; i & str.length(); i++)
&&&&&&&&& hash = hash * a + str.charAt(i);
&&&&&&&&& a&&& = a *
&&&&&& return (hash & 0x7FFFFFFF);
虽然Adler32算法的应用没有CRC32广泛,不过,它可能是乘法Hash里面最有名的一个了。关于它的介绍,大家可以去看RFC 1950规范。
四 除法Hash
除法和乘法一样,同样具有表面上看起来的不相关性。不过,因为除法太慢,这种方式几乎找不到真正的应用。需要注意的是,我们在前面看到的hash的 结果除以一个prime的目的只是为了保证结果的范围。如果你不需要它限制一个范围的话,可以使用如下的代码替代”hash%prime”: hash = hash ^ (hash&&10) ^ (hash&&20)。
五 查表Hash
查表Hash最有名的例子莫过于CRC系列算法。虽然CRC系列算法本身并不是查表,但是,查表是它的一种最快的实现方式。查表Hash中有名的例子有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。
六 混合Hash
混合Hash算法利用了以上各种方式。各种常见的Hash算法,比如MD5、Tiger都属于这个范围。它们一般很少在面向查找的Hash函数里面使用。
七 对Hash算法的评价
&这个页面提供了对几种流行Hash算法的评价。我们对Hash函数的建议如下:
1.&字符串的Hash。最简单可以使用基本的乘法Hash,当乘数为33时,对于英文单词有很好的散列效果(小于6个的小写形式可以保证没有冲突)。复杂一点可以使用FNV算法(及其改进形式),它对于比较长的字符串,在速度和效果上都不错。
2.&长数组的Hash。可以使用这种算法,它一次运算多个字节,速度还算不错。
本文简略的介绍了一番实际应用中的用于查找的Hash算法。Hash算法除了应用于这个方面以外,另外一个著名的应用是巨型字符串匹配(这时的 Hash算法叫做:rolling hash,因为它必须可以滚动的计算)。设计一个真正好的Hash算法并不是一件容易的事情。做为应用来说,选择一个适合的算法是最重要的。
九 数组hash
inline int hashcode(const int *v)
int s = 0;
for(int i=0; i&k; i++)
s=((s&&2)+(v[i]&&4))^(v[i]&&10);
s = s % M;
s = s & 0 ? s + M :
注:虽说以上的hash能极大程度地避免冲突,但是冲突是在所难免的。所以无论用哪种hash函数,都要加上处理冲突的方法。
原文:/blog/1874420
本文已收录于以下专栏:
相关文章推荐
Hash是什么,它的作用先举个例子。我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志。也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人很多,...
简介哈希方法学哈希函数和素数位偏移各种形式的哈希常用的哈希函数各版本哈希代码下载简介哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以...
代码全部来自 http://www.partow.net/programming/hashfunctions/index.html
unsigned int RSHash(cons...
这个比较多,还有性能测评:http://yuhuafx./_d.htmltimes33的哈希算法,就是乘以33求散列:static unsigned lon...
在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memcached、Redis、淘宝的Tair等,二、本地缓存,例...
在Linux中做C/C++开发经常会遇到一些不可预知的问题导致程序崩溃,同时崩溃后也没留下任何代码运行痕迹,因此,堆栈跟踪技术就显得非要重要了。本文将简单介绍Linux中C/C++程序运行时堆栈获取函...
在Ubuntu 14.04中使用带有SublimeClang插件的Sublime Text 3编辑器将会给你编写C/C++代码飞一般的感觉……
在程序中时间处理往往是一个麻烦的事,Linux系统提供了很多关于时间处理的函数,我们可以用这些函数来完成我们所需要的功能。本文详细讲解在C/C++开发过程中常用的时间处理函数。
五分钟让你深入了解分布式系统中常用的一致性哈希算法
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。
散列表(Hash table...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)聚类分析中几种算法的比较 - CSDN博客
聚类分析中几种算法的比较
将数据库中的对象进行聚类是聚类分析的基本操作,其准则是使属于同一类的个体间距离尽可能小,而不同类个体间距离尽可能大,为了找到效率高、通用性强的聚
类方法人们从不同角度提出了近百种聚类方法,典型的有K-means方法、K-medoids方法、CLARANS方法,BIRCH方法等,这些算法适用
于特定的问题及用户。本文综合提出了评价聚类算法好坏的5个标准,基于这5个标准,对数据挖掘中常用聚类方法作了比较分析,以便于人们更容易、更快捷地找
到一种适用于特定问题及用户的聚类算法。
聚类算法研究及比较框架
  聚类算法一般有五种方法,最主要的是划分方法和层次方法两种。划分聚类算法通过优化评价函数把数据集分割为K个部分,它需要K作为
输人参数。典型的分割聚类算法有K-means算法,
K-medoids算法、CLARANS算法。层次聚类由不同层次的分割聚类组成,层次之间的分割具有嵌套的关系。它不需要输入参数,这是它优于分割聚类
算法的一个明显的优点,其缺点是终止条件必须具体指定。典型的分层聚类算法有BIRCH算法、DBSCAN算法和CURE算法等。
  对各聚类算法的比较研究基于以下5个标准:
  ① 是否适用于大数据量,算法的效率是否满足大数据量高复杂性的要求;
  ② 是否能应付不同的数据类型,能否处理符号属性;
  ③ 是否能发现不同类型的聚类;
  ④ 是否能应付脏数据或异常数据;
  ⑤ 是否对数据的输入顺序不敏感。
  下面将在该框架下对各聚类算法作分析比较。
数据挖掘常用聚类算法比较分析
3.1 K-pototypes算法
  K-pototypes算法结合了K-means方法和根据K-means方法改进的能够处理符号属性的K-modes方法,同K-means方法相比,K-pototypes 算法能够处理符号属性。
  3.2 CLARANS算法(划分方法)
  CLARANS算法即随机搜索聚类算法,是一种分割聚类方法。它首先随机选择一个点作为当前点,然后随机检查它周围不超过参数Maxneighbor
个的一些邻接点,假如找到一个比它更好的邻接点,则把它移人该邻接点,否则把该点作为局部最小量。然后再随机选择一个点来寻找另一个局部最小量,直至所找
到的局部最小量数目达到用户要求为止。该算法要求聚类的对象必须都预先调人内存,并且需多次扫描数据集,这对大数据量而言,无论时间复杂度还是空间复杂度
都相当大。虽通过引人R-树结构对其性能进行改善,使之能够处理基于磁盘的大型数据库,但R*-树的构造和维护代价太大。该算法对脏数据和异常数据不敏
感,但对数据物人顺序异常敏感,且只能处理凸形或球形边界聚类。
  3.3 BIRCH算法(层次方法)
  BIRCH算法即平衡迭代削减聚类法,其核心是用一个聚类特征3元组表示一个簇的有关信息,从而使一簇点的表示可用对应的聚类特征,而不必用具体的一
组点来表示。它通过构造满足分支因子和簇直径限制的聚类特征树来求聚类。BIRCH算法通过聚类特征可以方便地进行中心、半径、直径及类内、类间距离的运
算。算法的聚类特征树是一个具有两个参数分枝因子B和类直径T的高度平衡树。分枝因子规定了树的每个节点子女的最多个数,而类直径体现了对一类点的直径大
小的限制即这些点在多大范围内可以聚为一类,非叶子结点为它的子女的最大关键字,可以根据这些关键字进行插人索引,它总结了其子女的信息。
  聚类特征树可以动态构造,因此不要求所有数据读人内存,而可以在外存上逐个读人。新的数据项总是插人到树中与该数据距离最近的叶子中。如果插人后使得
该叶子的直径大于类直径T,则把该叶子节点分裂。其它叶子结点也需要检查是否超过分枝因子来判断其分裂与否,直至该数据插入到叶子中,并且满足不超过类直
径,而每个非叶子节点的子女个数不大于分枝因子。算法还可以通过改变类直径修改特征树大小,控制其占内存容量。
  BIRCH算法通过一次扫描就可以进行较好的聚类,由此可见,该算法适合于大数据量。对于给定的M兆内存空间,其空间复杂度为O(M),时间间复杂度
为O(dNBlnB(M/P)).其中d为维数,N为节点数,P为内存页的大小,B为由P决定的分枝因子。I/O花费与数据量成线性关系。BIRCH算法
只适用于类的分布呈凸形及球形的情况,并且由于BIRCH算法需提供正确的聚类个数和簇直径限制,对不可视的高维数据不可行。
  3.4 CURE算法(层次方法)
  CURE算法即使用代表点的聚类方法。该算法先把每个数据点看成一类,然后合并距离最近的类直至类个数为所要求的个数为止。CURE算法将传统对类的
表示方法进行了改进,回避了用所有点或用中心和半径来表示一个类,而是从每一个类中抽取固定数量、分布较好的点作为描述此类的代表点,并将这些点乘以一个
适当的收缩因子,使它们更靠近类的中心点。将一个类用代表点表示,使得类的外延可以向非球形的形状扩展,从而可调整类的形状以表达那些非球形的类。另外,
收缩因子的使用减小了嗓音对聚类的影响。CURE算法采用随机抽样与分割相结合的办法来提高算法的空间和时间效率,并且在算法中用了堆和K-d树结构来提
高算法效率。
  3.5 DBSCAN算法(基于密度的方法)
  DBSCAN算法即基于密度的聚类算法。该算法利用类的密度连通性可以快速发现任意形状的类。其基本思想是:对于一个类中的每个对象,在其给定半径的
领域中包含的对象不能少于某一给定的最小数目。在DBSCAN算法中,发现一个类的过程是基于这样的事实:一个类能够被其中的任意一个核心对象所确定。为
了发现一个类,DBSCAN先从对象集D中找到任意一对象P,并查找D中关于关径Eps和最小对象数Minpts的从P密度可达的所有对象。如果P是核心
对象,即半径为Eps的P的邻域中包含的对象不少于Minpts,则根据算法,可以找到一个关于参数Eps和Minpts的类。如果P是一个边界点,则半
径为Eps的P邻域包含的对象少于Minpts,P被暂时标注为噪声点。然后,DBSCAN处理D中的下一个对象。
  密度可达对象的获取是通过不断执行区域查询来实现的。一个区域查询返回指定区域中的所有对象。为了有效地执行区域查询,DBSCAN算法使用了空间查
询R-树结构。在进行聚类前,必须建立针对所有数据的R*-树。另外,DBSCAN要求用户指定一个全局参数Eps(为了减少计算量,预先确定参数
Minpts)。为了确定取值,DBSCAN计算任意对象与它的第k个最临近的对象之间的距离。然后,根据求得的距离由小到大排序,并绘出排序后的图,称
做k-dist图。k-dist图中的横坐标表示数据对象与它的第k个最近的对象间的距离;纵坐标为对应于某一k-dist距离值的数据对象的个数。
R*-树的建立和k-dist图的绘制非常消耗时间。此外,为了得到较好的聚类结果,用户必须根据k-dist图,通过试探选定一个比较合适的Eps值。
DBSCAN算法不进行任何的预处理而直接对整个数据集进行聚类操作。当数据量非常大时,就必须有大内存量支持,I/O消耗也非常大。其时间复杂度为
O(nlogn)(n为数据量),聚类过程的大部分时间用在区域查询操作上。DBSCAN算法对参数Eps及Minpts非常敏感,且这两个参数很难确定。
  3.6 CLIQUE算法(综合了基于密度和基于网格的算法)
  CLIQUE算法即自动子空间聚类算法。该算法利用自顶向上方法求出各个子空间的聚类单元。CLUQUE算法主要用于找出在高维数据空间中存在的低维
聚类。为了求出d维空间聚类,必须组合给出所有d-1维子空间的聚类,导致其算法的空间和时间效率都较低,而且要求用户输入两个参数:数据取值空间等间隔
距离和密度阔值。这2个参数与样木数据紧密相关,用户一般难以确定。CLIQUE算法对数据输人顺序不敏感。
基于上述分析,我们得到各聚类算法的比较结果,结论如下:
算法 算法效率 适合的数据类型 发现的聚类类型 对脏数据或异常数据的敏感性 对数据输入顺序的敏感性
BIRCH&&&&&&
高&&&&&&&&&
数值&&&&&&&&&&&&
凸形或球形&&&&&&&&&&&
不敏感&&&&&&&&&&&&&&&&&
一般&&&&&&&&
数值&&&&&&&&&&&
任意形状&&&&&&&&&&&&&&&
敏感&&&&&&&&&&&&&&&&&&&&&& 敏感
CURE&&&&&&
较高&&&&&&&&
数值&&&&&&&&&&
任意形状&&&&&&&&&&&&&&
不敏感&&&&&&&&&&&&&&&&&
K-poto&&&&
数值和符号&&&&&
凸形或球形&&&&&&&&&&&&
敏感&&&&&&&&&&&&&&&&&&&&
CLARANS 较低&&&&&&&&
数值&&&&&&&&&&&
凸形或球形&&&&&&&&&&&
不敏感&&&&&&&&&&&&&&&& 非常敏感
较低&&&&&&&&
数值&&&&&&&&&&&&
凸形或球形&&&&&&&&&&&& 一般&&&&&&&&&&&&&&&&&&&
由于每个方法都有其特点和不同的适用领域,在数据挖掘中,用户应该根据实际需要选择恰当的聚类算法。
本文已收录于以下专栏:
相关文章推荐
将数据库中的对象进行聚类是聚类分析的基本操作,其准则是使属于同一类的个体间距离尽可能小,而不同类个体间距离尽可能大,为了找到效率高、通用性强的聚 类方法人们从不同角度提出了近百种聚类方法,典型的有K-...
什么是分类分类任务就是明确对象属于哪个预定义的目标类。其中预定义的目标类是离散时为分类,连续时为回归。有哪些分类方法常用的分类算法有决策树,基于规则的分类算法,神经网络,支持向量机和朴素贝叶斯分类法等...
四种聚类方法之比较
 SOTON数据分析
聚类分析是一种重要的人类行为,早在孩提时代,一个人就通过不断改进下意识中的聚类模式来学会如何区分猫狗、动物植物。目前在许多领域都...
1、分类和聚类的区别:
        Classification (分类),对于一个classifier,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classi...
聚类划分:
(1)划分聚类  k-means、k-medoids、k-modes、k-medians、kernel k-means
(2)层次聚类  Agglomerative
、divisiv...
聚类的目标是使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小。
1.基于划分:给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K
特点:计算量大...
Kmeans是最简单的聚类算法之一,应用十分广泛,Kmeans以距离作为相似性的评价指标,其基本思想是按照距离将样本聚成不同的簇,两个点的距离越近,其相似度就越大,以得到紧凑且独立的簇作为聚类目标。本...
kmeans之于模式识别,如同“hello world”之于C、之于任何一门高级语言。
谱聚类算法由于其算法流程简单、计算简洁与 Kmeans 算法相比不容易陷入局部最优解,能够对高维度、非常规分布的数据进行聚类。谱聚类算法是利用图谱理论来进行算法分析,思想是把数据分析问题看成是图的最优...
聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
1+1得数有多少种算法?
冰雪sYT18X
扫二维码下载作业帮
2亿+学生的选择
通常情况下等于二, 也可以等于三. 你思想有多宽广,答案就有多少. 100个人有100种不同的答案.
为您推荐:
其他类似问题
扫描下载二维码数学快速计算法(多种),很强大_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数学快速计算法(多种),很强大
&&数学快速计算法
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩59页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 排序算法有多少种 的文章

 

随机推荐