




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据与知识工程研究中心(2015)海量数据计算研究中心MassiveDataComputingLab@HIT算法设计与分析第三章排序与分治法哈尔滨工业大学王宏志wangzh@/pages/wang/数据与知识工程研究中心(2015)3.1排序介绍3.2
分治法3.3
mergesort3.4quicksort3.5排序问题的下界Outlines数据与知识工程研究中心(2015)3.1introduction排序的概念
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列例如,将下列关键字序列
52,49,80,36,14,58,61,23,97,75调整为
14,23,36,49,52,58,61,75,80,97数据与知识工程研究中心(2015)一般情况下,假设含n个记录的序列为
{R1,R2,…,Rn
}
其相应的关键字序列为
{K1,K2,…,Kn}这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系
Kp1≤Kp2≤…≤Kpn按此固有关系将式(1)的记录序列重新排列为
{Rp1,Rp2,…,Rpn}
的操作称作排序数据与知识工程研究中心(2015)例(张三,89),(李四,55),(王五,79),(大麻,92),(李亚鹏,10)元组第一项表示姓名,元组第二项表示成绩根据成绩从小到达可以将这些元组排序为(李亚鹏,10),(李四,55),(王五,79),(张三,89),(大麻,92)typedefinestructRecord{charname[20];integerscore;}Record;RecordR[5];R[1]=(张三,89),R[1]=(李四,55),…,R[4]=(李亚鹏,10)数据与知识工程研究中心(2015)内部排序与外部排序
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序我们本章主要内部排序的各种方法数据与知识工程研究中心(2015)内部排序方法的分类
在排序的过程中,参与排序的记录序列中存在两个区域:有序区和无序区。内部排序的过程是一个逐步扩大记录的有序序列长度的过程有序序列区
无
序
序
列
区
使有序区中记录的数目增加一个或几个的操作称为一趟排序数据与知识工程研究中心(2015)逐步扩大记录有序序列长度的方法有下列几类:插入类将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度选择类从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度交换类通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度归并类通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度其它方法数据与知识工程研究中心(2015)3.2Divide-and-Conquer技术Divide-and-Conquer算法的设计Divide-and-Conquer算法的分析
设计过程分为三个阶段Divide:整个问题划分为多个子问题Conquer:求解各子问题(递归调用正设计的算法)Combine:合并子问题的解,形成原始问题的解数据与知识工程研究中心(2015)Divide-and-Conquer算法的设计数据与知识工程研究中心(2015)原始问题求解子问题子问题子问题子问题…求解子问题求解子问题子问题解子问题解子问题解…合并子解问题分解DivideConquerMerge原始问题的解分析过程建立递归方程求解递归方程的建立方法设输入大小为n,T(n)为时间复杂性当n<c,
T(n)=
(1)数据与知识工程研究中心(2015)Divide-and-Conquer算法的分析数据与知识工程研究中心(2015)Divide阶段的时间复杂性划分问题为a个子问题。每个子问题大小为n/b。划分时间可直接得到=D(n)Conquer阶段的时间复杂性递归调用Conquer时间=aT(n/b)Combine阶段的时间复杂性时间可以直接得到=C(n)总之T(n)=(1)ifn<c
T(n)=aT(n/b)+D(n)+C(n)otherwise求解递归方程T(n)使用第二章的方法数据与知识工程研究中心(2015)数据与知识工程研究中心(2015)整数乘法
问题定义输入:n位二进制整数X和Y输出:X和Y的乘积通常,计算X*Y时间复杂性位O(n2),我们给出一个复杂性为O(n1.59)的算法。
ABn/2位X=n/2位
CDn/2位Y=n/2位XY=(A2n/2+B)(C2n/2+D)=AC2n+((A-B)(C-D)+BC+AD)2n/2
+BD算法计算A-B和C-D;计算n/2位乘法AC、BD、(A-B)(C-D);计算(A-B)(C-D)+BC+AD;AC左移n位,((A-B)(C-D)+BC+AD)左移n/2位;计算XY。算法的数学基础建立递归方程
T(n)=
(1)ifn=1T(n)=3T(n/2)+O(n) ifn>1使用Master定理
T(n)=O(nlog3)=O(n1.59)算法的分析数据与知识工程研究中心(2015)例2
max与min数据与知识工程研究中心(2015)问题定义输入:数组A[1,…,n]输出:A中的max和min通常,直接扫描需要2n-2次比较操作我们给出一个仅需
3n/2-2
次比较操作的算法。数据与知识工程研究中心(2015)基本思想基于任务不同将问题划分成两个子问题一个子问题求解max另一个子问题求解min将A[i]与A[n-i+1]比较,i=1,2,…,n/2较小的元素放在前面,较大的元素放在后面最小元素出现在A[1,2,…
n/2]中最大元素A[
n/2,…,n]中数据与知识工程研究中心(2015)算法Max-min(A)Input:数组A[1,…,n]Output:数组A[1,…,n]中的max和min1.Fori1Ton/2Do2.IFA[i]>A[n-i+1]THENswap(A[i],A[n-i+1]);3.maxA[n];minA[1];4.For2Ton/2Do5.IFA[i]<minTHENminA[i];6.IFA[n-i+1]>maxTHENmaxA[n-i+1];7.printmax,min;算法复杂性
3n/2-2
次比较操作数据与知识工程研究中心(2015)基于分治思想的排序算法94865213710划分x1,x2,…,xkxk+1,…,xn递归求解递归求解a1,a2,…,akbk+1,…,bn合并y1,…,yn划分的策略1.选择一个位置将数组划分成两个部分mergesort9,4,8,6,52,1,3,7,104,5,6,8,91,2,3,7,101,2,3,4,5,6,7,8,9,104,6,5,2,1,39,8,7,101,2,3,4,5,67,8,9,10合并策略不同的划分策略对应不同的合并策略由于分治思想涉及到递归调用,需要关心子问题的最一般形式在排序问题中,子问题一般形式就是将A[i,…,j]中的元素排序2.选择一个划分标准x,根据元素与x的大小关系来划分
quicksort数据与知识工程研究中心(2015)3.3
Merge-sort算法
=A[i,…,j]Divide:本质上仅需产生划分位置k第一个子问题是A[i,…,k]第二个子问题是A[k+1,…,j]为使得两个问题的大小大致相当,k可以如下产生
k=(i+j)/2数据与知识工程研究中心(2015)=A[i,…,j]Conquer:递归求解就是算法的递归调用Mergesort(A,i,k);//求解第一个子问题Mergesort(A,k+1,j);//求解第二个子问题数据与知识工程研究中心(2015)combine:将两个有序序列合并成一个有序序列1.li;hk+1;t=i
//设置指针2.Whilel
k&h<jDoIFA[l]<A[h]THENB[t]
A[l];l
l+1;tt+1;ELSEB[t]
A[h];h
h+1;tt+1;3.IFl<kTHEH//第一个子问题有剩余元素
Forv
lTokDo
B[t]
A[v];tt+1;4.IFh<jTHEN//第二个子问题有剩余元素
Forv
hTojDo
B[t]
A[v];tt+1;4,5,6,8,91,2,3,7,10combine4,5,6,8,91,2,3,7,10combine4,5,6,8,91,2,3,7,10combine1,4,5,6,8,91,2,3,7,10combine1,24,5,6,8,91,2,3,7,10combine1,2,34,5,6,8,91,2,3,7,10combine1,2,3,4,4,5,6,8,91,2,3,7,10combine1,2,3,4,54,5,6,8,91,2,3,7,10combine1,2,3,4,5,64,5,6,8,91,2,3,7,10combine1,2,3,4,5,6,7,4,5,6,8,91,2,3,7,10combine1,2,3,4,5,6,7,8,4,5,6,8,91,2,3,7,10combine1,2,3,4,5,6,7,8,94,5,6,8,91,2,3,7,10combine1,2,3,4,5,6,7,8,9,10数据与知识工程研究中心(2015)MergeSort(A,i,j)Input:A[i,…,j]Output:排序后的A[i,…,j]k(i+j)/2;MergeSort(A,i,k);MergeSort(A,k+1,j);4.li;hk+1;t=i
//设置指针5.Whilel
k&h<jDo6.IFA[l]<A[h]THENB[t]
A[l];l
l+1;tt+1;7.ELSEB[t]
A[h];h
h+1;tt+1;8.IFl<kTHEH//第一个子问题有剩余元素9.Forv
lTokDo10.B[t]
A[v];tt+1;11.IFh<jTHEN//第二个子问题有剩余元素12.Forv
hTojDoB[t]
A[v];tt+1;Forv
iTojDo//将归并后的数据复制到A中
A[v]
B[v];Mergesort算法T(n)=2T(n/2)+O(n)T(n)=O(nlogn)435819267435819267中位数问题定义Input:
由n个数构成的多重集合XOutput:
x
X使得-1|{y
X|y<x}|-|{y
X|y>x}|1[Blumetal.STOC’72&JCSS’73]A“shining”paperbyfiveauthors:ManuelBlum(TuringAward1995)RobertW.Floyd(TuringAward1978)VaughanR.PrattRonaldL.Rivest(TuringAward2002)RobertE.Tarjan(TuringAward1986)从n个数中选取中位数需要的比较操作的次数介于
1.5n到
5.43n之间中位数选取问题的复杂度上界3n+o(n)bySchonhage,Paterson,andPippenger(JCSS1975).2.95nbyDorandZwick
(SODA1995,SIAMJournalonComputing1999).下界2n+o(n)byBentandJohn(STOC1985)(2+2-80)nbyDorandZwick(FOCS1996,SIAMJournalonDiscreteMath2001).比较操作次数的上下界线性时间选择本节讨论如何在O(n)时间内从n个不同的数中选取第i大的元素中位数问题也就解决了,因为选取中位数即选择第n/2-大的元素Input:
n个(不同)数构成的集合X,整数i,其中1
i
nOutput:
x
X使得X中恰有i-1个元素小于x第一步:分组,每组5个数
最后一组可能少于5个数求解步骤第二步:将每组数分别用InsertionSort排序
选出每组元素的中位数排序每组数时,比较操作的次数为5(5-1)/2=10次总共需要10*
n/5次比较操作第三步:
递归调用算法求得这些中位数的中位数(MoM)
时间复杂性:T(
n/5
)第四步:用
MoM完成划分>MoM<MoMMoMxX>X<时间复杂性O(n)第五步:递归设x是中位数的中位数(MoM),划分完成后其下标为k
如果i=k,则返回x
如果i<k,则在第一个部分递归选取第i-大的数如果i>k,则在第三个部分递归选取第(i-k)-大的数<MoM>MoMMoMxX>X<算法Select(A,i)Input:数组A[1:n],1
i
nOutput:A[1:n]中的第i-大的数
1.forj1ton/52.InsertSort(A[(j-1)*5+1:(j-1)*5+5]);3.swap(A[j],A[[(j-1)*5+3]);4.xSelect(A[1:n/5],n/10);5.kpartition(A[1:n],x);6.ifk=ithenreturnx;7.elseifk>ithenretrunSelect(A[1:k-1],i);8.elseretrunSelect(A[k+1:n],i-k);
第五步第二步第一步第三步第四步算法Select(A,i)Input:数组A[1:n],1
i
nOutput:A[1:n]中的第i-大的数
1.forj1ton/52.InsertSort(A[(j-1)*5+1:(j-1)*5+5]);3.swap(A[j],A[[(j-1)*5+3]);4.xSelect(A[1:n/5],n/10);5.kpartition(A[1:n],x);6.ifk=ithenreturnx;7.elseifk>ithenretrunSelect(A[1:k-1],i);8.elseretrunSelect(A[k+1:n],i-k);
???O(n)T(
n/5)O(n)算法分析观察第五步的处理过程第五步至少删除了
3n/10
个数n-
3n/107n/10+6
如果时间复杂度是输入规模的递增函数
则第五步的时间开销不超过T(7n/10+6)
(1)ifn
CT
n/5+T(7n/10+6)+
(n)
ifn>CT(n)
T(n)=O(n)数据与知识工程研究中心(2015)
3.4
QuickSort数据与知识工程研究中心(2015)Partitionsort94865213710=A[i,…,j]划分x1,x2,…,xkxk+1,…,xn递归求解递归求解a1,a2,…,akbk+1,…,bn合并1,2,3,4,5,6,7,8,9,104,6,5,2,1,39,8,7,101,2,3,4,5,67,8,9,10基本思想Divide:确定一个划分标准x,将数组中小于x的元素放到数组的前面部分,大于x的元素放到数组的后面部分,并返回一个划分k;Conquer:递归调用算法将A[i,…,k]和A[k+1,…,j]求解。Combine:无操作数据与知识工程研究中心(2015)PartitionSort算法框架PartitionSort(A,i,j)Input:A[i,…,j],xOutput:排序后的A[i,…,j]选择划分元素x;k=partition(A,i,j,x);
//用x完成划分partitionSort(A,i,k);//递归求解子问题partitionSort(A,k+1,j);//无需额外的合并操作
数据与知识工程研究中心(2015)Divide94865213710=A[i,…,j]94865213710=A[i,…,j]x=73486521
9710=A[i,…,j]3416528
9710=A[i,…,j]341652
8
9710=A[i,…,j]341652=A[i,…,high]89710=A[high+1,…,j]指针low从低区中找出应放到x之后的第一个元素指针high从高区中找出应放到x之前的第一个元素如果确实应该交low和high标记的两个元素的位置,则交换否则划分位置就是high数据与知识工程研究中心(2015)Divide过程的算法描述Partition(A,i,j,x)Input:A[i,…,j],xOutput:划分位置k使得A[i,…,k]中的元素均小于x且A[k+1,…,j]
中的元素均大于等于xlow
i;high
j;While(low<high)Doswap(A[low],A[high]);While(A[low]<x)Do
low
low+1;While(A[high]>=x)Do
high
high-1;return(high)数据与知识工程研究中心(2015)PartitionSort算法Partition(A,i,j,x)low
i;high
j;While(low<high)Doswap(A[low],A[high]);While(A[low]<x)Do
low
low+1;While(A[high]>=x)Do
high
high-1;return(high)PartitionSort(A,i,j)Input:A[i,…,j],xOutput:排序后的A[i,…,j]x
A[i];//以确定的策略选择xk=partition(A,i,j,x);
//用x完成划分partitionSort(A,i,k);//递归求解子问题partitionSort(A,k+1,j);
数据与知识工程研究中心(2015)最好情况
:
(nlogn)数组被分为大致相等的两个部分.
需要logn
轮.
每轮需要O(n)次比较算法复杂性的分析数据与知识工程研究中心(2015)最坏情况
:
(n2)每一轮用最大或者最小元素划分算法复杂性的分析数据与知识工程研究中心(2015)平均情况:
(nlogn)算法复杂性的分析数据与知识工程研究中心(2015)算法复杂性的分析数据与知识工程研究中心(2015)算法复杂性的分析数据与知识工程研究中心(2015)随机QuickSort算法Partition(A,i,j,x)low
i;high
j;While(low<high)Doswap(A[low],A[high]);While(A[low]<x)Do
low
low+1;While(A[high]>=x)Do
high
high-1;return(high)QuickSort(A,i,j)Input:A[i,…,j],xOutput:排序后的A[i,…,j]temprand(i,j);//产生i,j之间的随机数x
A[temp];//以确定的策略选择xk=partition(A,i,j,x);
//用x完成划分partitionSort(A,i,k);//递归求解子问题partitionSort(A,k+1,j);
数据与知识工程研究中心(2015)算法性能的分析
基本概念
S(i)表示S中阶为i的元素
例如,S(1)和S(n)分别是最小和最大元素随机变量Xij定义如下:
Xij=1如果S(i)和S(j)在运行中被比较,否则为0Xij是S(i)和S(j)的比较次数算法的比较次数为算法的平均复杂性为数据与知识工程研究中心(2015)
计算E[Xij]
设pij为S(i)和S(j)在运行中比较的概率,则
E[Xij]=pij1+(1-pij)0=pij关键问题成为求解pij数据与知识工程研究中心(2015)
求解Pij我们可以用树表示算法的计算过程
yT1T2yxT11T12xT21T22
我们可以观察到如下事实:
一个子树的根必须与其子树的所有节点比较不同子树中的节点不可能比较任意两个节点至多比较一次数据与知识工程研究中心(2015)
当S(i),S(i+1),…,S(j)在同一子树时,
S(i)和S(j)才可能比较只有S(i)或S(j)先于S(i+1),…,S(j-1)被选为划分点时,S(i)和S(j)才可能比较
S(i),S(i+1),…,S(j)等可能地被选为划分点,所以S(i)和S(j)
进行比较的概率是:2/(j-i+1),即pij=2/(j-i+1)数据与知识工程研究中心(2015)
现在我们有
定理.随机排序算法的期望时间复杂性为O(nlogn)3.5排序问题的下界问题的下界是解决该问题的算法所需要的最小时间复杂性。 ☆
最坏情况下界
☆
平均情况下界问题的下界是不唯一的例如.
(1),
(n),
(nlogn)都是排序的下界数据与知识工程研究中心(2015)如果一个问题的最高下界是
(nlogn)而当前最好算法的时间复杂性是O(n2).我们可以寻找一个更高的下界.我们可以设计更好的算法.下界和算法都是可以改进的.如果一个问题的下界是
(nlogn)且算法的时间复杂性是
O(nlogn),那么这个算法是最优的。数据与知识工程研究中心(2015)
3个元素有6种排列 a1 a2 a3 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1数据与知识工程研究中心(2015)最坏情况下排序的下界直接插入排序输入:(2,3,1) (1)a1:a2
(2)a2:a3,a2
a3
(3)a1:a2,a1
a2
输入:(2,1,3) (1)a1:a2,a1
a2
(2)a2:a3数据与知识工程研究中心(2015)直接插入排序的决策树数据与知识工程研究中心(2015)冒泡排序的决策树数据与知识工程研究中心(2015)排序的下界为了找到排序的下界,我们需要找到二叉树的最小高度.有n!种不同排列
二叉决策树有n!个叶子结点.平衡树高度最小
log(n!)
=
(nlogn)
排序的下界是:
(nlogn)数据与知识工程研究中心(2015)方法
1:数据与知识工程研究中心(2015)方法2:Stirling近似:n!
logn!
log
nlogn
(nlogn)
数据与知识工程研究中心(2015)排序的平均情况下界仍利用决策树排序算法的平均复杂性用从根结点到每个叶子结点的路径长度的总长度描述。n!当树平衡时这个值最小. (所有叶子结点的深度是
d或
d
1)数据与知识工程研究中心(2015)数据与知识工程研究中心(2015)平均情况下排序的下界计算最小路径长度和数据与知识工程研究中心(2015)1.
有c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025煤矿企业主要负责人安全生产知识和管理能力考试经典试题及答案
- 综合解析苏科版八年级物理下册《力与运动》同步测试试卷(附答案详解)
- 考点解析-人教版八年级物理上册第6章质量与密度-质量专题测试试题(含详细解析)
- 2025建筑结构构造试题及答案
- 综合解析人教版八年级物理《功和机械能》章节练习试题(含答案解析)
- 考点解析-人教版八年级物理上册第4章光现象同步训练试卷
- 达标测试人教版八年级物理上册第5章透镜及其应用-透镜综合测评试卷(附答案详解)
- 考点解析人教版八年级上册物理物态变化《汽化和液化》专项攻克练习题(含答案详解)
- 考点攻克人教版八年级上册物理物态变化《汽化和液化》章节训练试卷(含答案详解版)
- 绘画光影考试题及答案解析
- 计量实验室规划
- 《塞万提斯》课件
- 2024-2025学年山东省聊城市东昌府区东昌中学七年级(上)期中数学试卷(无答案)
- 数据安全风险评估报告
- 中国汽车行业ESG评价指南
- 《建设监理规范用表》新规范表格版
- 项目支出管理办法
- 热射病PBL护理查房-夏日炎炎谨防中暑
- DB32TDB32T3964-2020民用建筑能效测评标识标准
- 成人癫痫持续状态护理专家共识2023
- 团队合作精神培养售后工程师考核方案实战演练
评论
0/150
提交评论