‘壹’ 数据结构中快速排序算法的不足以及改进
一般快速排序算法都是以最左元素作为划分的基准值,这样当数据元素本身已经完全有序(不管正序或者逆序)时,每一趟划分只能将一个元素分割出来,其效率很低:时间复杂度O(n^2),空间复杂度为O(n)
所以改进方法就是找寻合适的基准值,保证不至于在关键字有序或者接近有序时发生这个情况,一般可以使用三者取中(就是待划分序列的头元素、尾元素、中间元素三者的中间值)、或者随机选择等方法,这样即使关键字完全有序,也可以保证时间复杂度O(nlogn),空间复杂度O(logn)
‘贰’ 排序法的缺点有
排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。
‘叁’ 如何看待Python/java的排序算法被发现有潜在的bug
java和Python的默认排序算法(TimSort)虽然在日常情况中运行良好,但在极端情况下会出现越界异常导致崩溃.这说明:
以结果为导向的测试方法,虽然在普通情况下能够方便,快速的测试程序。但是也存在特殊的情况,并且这些极端情况还很容易被忽视掉,然后造成一些bug和异常。
2.形式化分析方法是有效的,可行的。在重点项目或者安全性要求高的项目中,尽可能的使用形式化分析方法。降低风险。
‘肆’ 各种排序算法最好和最坏情况比较
都不知道怎么回答,各种排序说的也太多了,这里讲几种简单的吧,希望对你有帮助!
比如n个顺序存储元素进行排序,a[0]做“哨兵”(即a[0]不存数据,而是用作辅存空间使用)的情况
1 直接插入排序:比较次数 最少n-1次;最多(n-1)(n+2)/2
移动次数 最少0; 最多(n-1)(n+4)/2
使用一个辅助存储空间,是稳定的排序;
2 折半插入排序:比较次数 最少与最多同,都是n*log2n(其中2为底,下边表示同),
移动次数 最少0,最多时间复杂度为O(n2);(n的平方,以下也如此表示);
使用一个辅助存储空间,是稳定的排序;
3 冒泡排序: 比较最少为:n-1次,最多时间复杂度表示为o(n2);
移动次数最少为0,最多时间复杂度表示为O(n2);
使用一个辅存空间,是稳定的排序;
4 简单选择排序: 比较次数没有多少之分,均是n(n-1)/2;
移动次数最少为0,最多为3(n-1);
使用一个辅存空间,是稳定的排序;
5 快速排序:比较和移动次数最少时间复杂度表示为O(n*log2n);
比较和移动次数最多的时间复杂度表示为O(n2);
使用的辅助存储空间最少为log2n,最多为n的平方;是不稳定的排序;
6 堆排序: 比较和移动次数没有好坏之分,都是O(n*log2n);
使用一个辅存空间,是不稳定的排序;
7 2-路归并排序:比较和移动次数没有好坏之分,都是O(n*log2n);
需要n个辅助存储空间,是稳定的排序;
另外还有很多的排序方法如 希尔排序,基数排序,2-路插入排序 等等很多的排序方法,这里就不一一列举了,希望列举的对你有帮助!!
‘伍’ 搜索引擎的排序算法都有哪些是怎么实现的
2.1基于词频统计——词位置加权的搜索引擎
利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索引擎的核心排序技术。其基本原理是:关键词在文档中词频越高,出现的位置越重要,则被认为和检索词的相关性越好。
1)词频统计
文档的词频是指查询关键词在文档中出现的频率。查询关键词词频在文档中出现的频率越高,其相关度越大。但当关键词为常用词时,使其对相关性判断的意义非常小。TF/IDF很好的解决了这个问题。TF/IDF算法被认为是信息检索中最重要的发明。TF(Term Frequency):单文本词汇频率,用关键词的次数除以网页的总字数,其商称为“关键词的频率”。IDF(Inverse Document Frequency):逆文本频率指数,其原理是,一个关键词在N个网页中出现过,那么N越大,此关键词的权重越小,反之亦然。当关键词为常用词时,其权重极小,从而解决词频统计的缺陷。
2)词位置加权
在搜索引擎中,主要针对网页进行词位置加权。所以,页面版式信息的分析至关重要。通过对检索关键词在Web页面中不同位置和版式,给予不同的权值,从而根据权值来确定所搜索结果与检索关键词相关程度。可以考虑的版式信息有:是否是标题,是否为关键词,是否是正文,字体大小,是否加粗等等。同时,锚文本的信息也是非常重要的,它一般能精确的描述所指向的页面的内容。
2.2基于链接分析排序的第二代搜索引擎
链接分析排序的思想起源于文献引文索引机制,即论文被引用的次数越多或被越权威的论文引用,其论文就越有价值。链接分析排序的思路与其相似,网页被别的网页引用的次数越多或被越权威的网页引用,其价值就越大。被别的网页引用的次数越多,说明该网页越受欢迎,被越权威的网页引用,说明该网页质量越高。链接分析排序算法大体可以分为以下几类:基于随机漫游模型的,比如PageRank和Repution算法;基于概率模型的,如SALSA、PHITS;基于Hub和Authority相互加强模型的,如HITS及其变种;基于贝叶斯模型的,如贝叶斯算法及其简化版本。所有的算法在实际应用中都结合传统的内容分析技术进行了优化。本文主要介绍以下几种经典排序算法:
1)PageRank算法
PageRank算法由斯坦福大学博士研究生Sergey Brin和Lwraence Page等提出的。PageRank算法是Google搜索引擎的核心排序算法,是Google成为全球最成功的搜索引擎的重要因素之一,同时开启了链接分析研究的热潮。
PageRank算法的基本思想是:页面的重要程度用PageRank值来衡量,PageRank值主要体现在两个方面:引用该页面的页面个数和引用该页面的页面重要程度。一个页面P(A)被另一个页面P(B)引用,可看成P(B)推荐P(A),P(B)将其重要程度(PageRank值)平均的分配P(B)所引用的所有页面,所以越多页面引用P(A),则越多的页面分配PageRank值给P(A),PageRank值也就越高,P(A)越重要。另外,P(B)越重要,它所引用的页面能分配到的PageRank值就越多,P(A)的PageRank值也就越高,也就越重要。
其计算公式为:
PR(A):页面A的PageRank值;
d:阻尼系数,由于某些页面没有入链接或者出链接,无法计算PageRank值,为避免这个问题(即LinkSink问题),而提出的。阻尼系数常指定为0.85。
R(Pi):页面Pi的PageRank值;
C(Pi):页面链出的链接数量;
PageRank值的计算初始值相同,为了不忽视被重要网页链接的网页也是重要的这一重要因素,需要反复迭代运算,据张映海撰文的计算结果,需要进行10次以上的迭代后链接评价值趋于稳定,如此经过多次迭代,系统的PR值达到收敛。
PageRank是一个与查询无关的静态算法,因此所有网页的PageRank值均可以通过离线计算获得。这样,减少了用户检索时需要的排序时间,极大地降低了查询响应时间。但是PageRank存在两个缺陷:首先PageRank算法严重歧视新加入的网页,因为新的网页的出链接和入链接通常都很少,PageRank值非常低。另外PageRank算法仅仅依靠外部链接数量和重要度来进行排名,而忽略了页面的主题相关性,以至于一些主题不相关的网页(如广告页面)获得较大的PageRank值,从而影响了搜索结果的准确性。为此,各种主题相关算法纷纷涌现,其中以以下几种算法最为典型。
2)Topic-Sensitive PageRank算法
由于最初PageRank算法中是没有考虑主题相关因素的,斯坦福大学计算机科学系Taher Haveli-wala提出了一种主题敏感(Topic-Sensitive)的PageRank算法解决了“主题漂流”问题。该算法考虑到有些页面在某些领域被认为是重要的,但并不表示它在其它领域也是重要的。
网页A链接网页B,可以看作网页A对网页B的评分,如果网页A与网页B属于相同主题,则可认为A对B的评分更可靠。因为A与B可形象的看作是同行,同行对同行的了解往往比不是同行的要多,所以同行的评分往往比不是同行的评分可靠。遗憾的是TSPR并没有利用主题的相关性来提高链接得分的准确性。
3)HillTop算法
HillTop是Google的一个工程师Bharat在2001年获得的专利。HillTop是一种查询相关性链接分析算法,克服了的PageRank的查询无关性的缺点。HillTop算法认为具有相同主题的相关文档链接对于搜索者会有更大的价值。在Hilltop中仅考虑那些用于引导人们浏览资源的专家页面(Export Sources)。Hilltop在收到一个查询请求时,首先根据查询的主题计算出一列相关性最强的专家页面,然后根据指向目标页面的非从属专家页面的数量和相关性来对目标页面进行排序。
HillTop算法确定网页与搜索关键词的匹配程度的基本排序过程取代了过分依靠PageRank的值去寻找那些权威页面的方法,避免了许多想通过增加许多无效链接来提高网页PageRank值的作弊方法。HillTop算法通过不同等级的评分确保了评价结果对关键词的相关性,通过不同位置的评分确保了主题(行业)的相关性,通过可区分短语数防止了关键词的堆砌。
但是,专家页面的搜索和确定对算法起关键作用,专家页面的质量对算法的准确性起着决定性作用,也就忽略了大多数非专家页面的影响。专家页面在互联网中占的比例非常低(1.79%),无法代表互联网全部网页,所以HillTop存在一定的局限性。同时,不同于PageRank算法,HillTop算法的运算是在线运行的,对系统的响应时间产生极大的压力。
4)HITS
HITS(Hyperlink Inced Topic Search)算法是Kleinberg在1998年提出的,是基于超链接分析排序算法中另一个最着名的算法之一。该算法按照超链接的方向,将网页分成两种类型的页面:Authority页面和Hub页面。Authority页面又称权威页面,是指与某个查询关键词和组合最相近的页面,Hub页面又称目录页,该页面的内容主要是大量指向Authority页面的链接,它的主要功能就是把这些Authority页面联合在一起。对于Authority页面P,当指向P的Hub页面越多,质量越高,P的Authority值就越大;而对于Hub页面H,当H指向的Authority的页面越多,Authority页面质量越高,H的Hub值就越大。对整个Web集合而言,Authority和Hub是相互依赖、相互促进,相互加强的关系。Authority和Hub之间相互优化的关系,即为HITS算法的基础。
HITS基本思想是:算法根据一个网页的入度(指向此网页的超链接)和出度(从此网页指向别的网页)来衡量网页的重要性。在限定范围之后根据网页的出度和入度建立一个矩阵,通过矩阵的迭代运算和定义收敛的阈值不断对两个向量Authority和Hub值进行更新直至收敛。
实验数据表明,HITS的排名准确性要比PageRank高,HITS算法的设计符合网络用户评价网络资源质量的普遍标准,因此能够为用户更好的利用网络信息检索工具访问互联网资源带来便利。
但却存在以下缺陷:首先,HITS算法只计算主特征向量,处理不好主题漂移问题;其次,进行窄主题查询时,可能产生主题泛化问题;第三,HITS算法可以说一种实验性质的尝试。它必须在网络信息检索系统进行面向内容的检索操作之后,基于内容检索的结果页面及其直接相连的页面之间的链接关系进行计算。尽管有人尝试通过算法改进和专门设立链接结构计算服务器(Connectivity Server)等操作,可以实现一定程度的在线实时计算,但其计算代价仍然是不可接受的。
2.3基于智能化排序的第三代搜索引擎
排序算法在搜索引擎中具有特别重要的地位,目前许多搜索引擎都在进一步研究新的排序方法,来提升用户的满意度。但目前第二代搜索引擎有着两个不足之处,在此背景下,基于智能化排序的第三代搜索引擎也就应运而生。
1)相关性问题
相关性是指检索词和页面的相关程度。由于语言复杂,仅仅通过链接分析及网页的表面特征来判断检索词与页面的相关性是片面的。例如:检索“稻瘟病”,有网页是介绍水稻病虫害信息的,但文中没有“稻瘟病”这个词,搜索引擎根本无法检索到。正是以上原因,造成大量的搜索引擎作弊现象无法解决。解决相关性的的方法应该是增加语意理解,分析检索关键词与网页的相关程度,相关性分析越精准,用户的搜索效果就会越好。同时,相关性低的网页可以剔除,有效地防止搜索引擎作弊现象。检索关键词和网页的相关性是在线运行的,会给系统相应时间很大的压力,可以采用分布式体系结构可以提高系统规模和性能。
2)搜索结果的单一化问题
在搜索引擎上,任何人搜索同一个词的结果都是一样。这并不能满足用户的需求。不同的用户对检索的结果要求是不一样的。例如:普通的农民检索“稻瘟病”,只是想得到稻瘟病的相关信息以及防治方法,但农业专家或科技工作者可能会想得到稻瘟病相关的论文。
解决搜索结果单一的方法是提供个性化服务,实现智能搜索。通过Web数据挖掘,建立用户模型(如用户背景、兴趣、行为、风格),提供个性化服务。
‘陆’ 数据结构的排序算法中,哪些排序是稳定的,哪些排序是不稳定的
一、稳定排序算法
1、冒泡排序
2、鸡尾酒排序
3、插入排序
4、桶排序
5、计数排序
6、合并排序
7、基数排序
8、二叉排序树排序
二、不稳定排序算法
1、选择排序
2、希尔排序
3、组合排序
4、堆排序
5、平滑排序
6、快速排序
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。
一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。
做这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
(6)排序算法的缺陷扩展阅读:
排序算法的分类:
1、通过时间复杂度分类
计算的复杂度(最差、平均、和最好性能),依据列表(list)的大小(n)。
一般而言,好的性能是 O(nlogn),且坏的性能是 O(n^2)。对于一个排序理想的性能是 O(n)。
而仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要 O(nlogn)。
2、通过空间复杂度分类
存储器使用量(空间复杂度)(以及其他电脑资源的使用)
3、通过稳定性分类
稳定的排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。
‘柒’ 怎样理解选择排序算法的不稳定
怎样理解选择排序算法的不稳定
区别在于:冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。而选择排序算法的改进在于:先并不急于调换位置,先从A[1]开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调,这时A[1]到A[10]中最小的数据就换到了最前面的位置。 所以,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数是一样的。
‘捌’ 简述各种排序算法的优缺点
一、冒泡排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与 a[2]的值,若a[1]大于a[2]则交换 两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比 较a[3]与a[4],以此 类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n- 1]以相同方法 处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理 n-1 轮 后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定;
缺点:慢,每次只能移动相邻两个数据。
二、选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数 据元素排完。
选择排序是不稳定的排序方法。
n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1 趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1 个记录R[1]交换,使R[1..1]和R[2..n]分别变 为记录个数增加1 个的新有序区和记录个数减少1 个的新无序区。
③第i 趟排序
第i 趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟 排序从当前无序区中选出关键字最 小的记录 R[k],将它与无序区的第1 个记录R 交换,使R[1..i]和R 分别变为记录个数增加1 个的新有序区和记录个数减少 1 个的新无序区。
这样,n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果。
优点:移动数据的次数已知(n-1 次);
缺点:比较次数多。
三、插入排序
已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、 b[2]、……b[m],需将二者合并成一个升序数列。 首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值, 若b[1]仍然大于a[2],则继续跳过,直 到b[1]小于a 数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来 a[x]的位置这就完成了b[1] 的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1 的数组a)
优点:稳定,快;
缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决 这个问题。
四、缩小增量排序
由希尔在1959 年提出,又称希尔排序(shell 排序)。
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n 不大时,插入 排序的效果很好。首先取一增 量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、 a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……="" 列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操="" 作,直到d="1。"
优点:快,数据移动少;=""
缺点:不稳定,d="" 的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。=""
五、快速排序=""
快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。
="" 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]="" 作为基准。比较a[x]与其它数据并="" 排序,使a[x]排在数据的第k="" 位,并且使a[1]~a[k-1]中的每一个数="" 据a[x],然后采 用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n] 两组数据进行快速排序。
优点:极快,数据移动少;
缺点:不稳定。
‘玖’ 为什么快速排序是不稳定的算法
排序算法不稳定的含义是:
在排序之前,有两个数相等.
但是在排序结束之后,它们两个有可能改变顺序.
比如说:
在一个待排序队列中,A和B相等,且A排在B的前面,而排序之后,A排在了B的后面.这个时候,我们说这种算法是不稳定的.
(只要有这种可能性,我们就说算法是不稳定的.)
注: 算法的不稳定性,与所用的语言没有关系的.
那么,快速排序为什么不稳定呢?
我们来看看快速排序的过程:(还是借用之前的那个假设,假设A,B相等,并和其它一堆数据一起参加排序.)
假设此时的快排是小于等于关键字为排在前面的一组组,大于为另外排在后面的一组.
在选取一个数出来分组的时候,如果选到了A,那么在B<=A的情况下,B将会排在A的前面.
因为有这样的_可能性_,所以说我们这种算法是不稳定的.
注:请参考快排的具体算法.
另外,TO 朱_大志同学,可能我们两个的教材有一定的差别.