第2章 递归与分治策略(2-例子)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.9 线性时间的选择问题
2.9 线性时间的选择问题
将n个输入元素划分成n/5个组,每组5个元素,只可能 有一个组不是5个元素。用任意一种排序算法,将每组中的 元素排好序,并取出每组的中位数,共n/5个。 递归调用select来找出这n/5个元素的中位数。如果 n/5是偶数,就找它的2个中位数中较大的一个。以这个 元素作为划分基准。 设所有元素互不相同。在这种情况 下,找出的基准x至少比3(n-5)/10个 元素大,因为在每一组中有2个元素 小于本组的中位数,而n/5个中位数 中又有(n-5)/10个小于基准x。同 理,基准x也至少比3(n-5)/10个元素 小。而当n≥75时,3(n-5)/10≥n/4 所以按此基准划分所得的2个子数组 的长度都至少缩短1/4。
统计学上还有一个常用的 “众数”(出现次数最多 2.9 线性时间的选择问题 的数),用来反映一组数据的集中程度及普遍倾 向。同中位数一样,也不易受一组数据中极端数据 的影响。一般用于数据较为集中的场合。 总结:平均数——整体的平均水平;中位数—— 中等水平;众数——多数情况
物价攀升,贫富拉大,人民生活水深火热。统计局常常用 “平均数”来掩盖问题! “张村有个张千万,隔壁九个穷光蛋,平均起来算一算, 人人都是张百万。” 若是“中位数”做统计,“张村”个人财产中位数就是“零”。 人民收入属于非“正态分布” ,贫富差距大,通常中位数 小于平均数。 在一组相差较大的数据中,用中位数或众数来统计数据特 征更有意义。
T (n) T ( n / 7 ) T (5n / 7) O (n) T (n) O (n) T (n) T ( n / 9) T (7 n / 8) O (n) T (n) O (n)
当r=3时: T (n) T ( n / 3) T (2n / 3) O(n) T (n) O(n log n) 当r为>=5的奇数时:算法Select都是线性的时间算法
2.9 线性时间的选择问题
2,找最大和最小元素FindMaxMin
3,找第二大
2.9 线性时间的选择问题
4,一般性选择问题 几种思路: (1)排序法
(2)堆 + 部分排序:O(n+klogn) 先建最小堆: 最小堆 O(n) 弹堆顶元素k次,第k次获得第k小元素:k*O(logn) 当k较小,接近线性效率,但堆的空间较大。
2.9 线性时间的选择问题
4,一般性选择问题 (3)堆 :O(nlogk) 这种思路是前述(2)方法的改进: 先建一个长度为k的最大堆,存储 n个元素的前k个元素, 最大堆 并假设他们就是最小的k个数,建堆费时O(k); 弹堆顶x,将后续n-k个元素逐个遍历,和堆顶x比较,若 比x小,插入并更新堆,若比x大,丢弃; 总耗时最坏:O(k+(n-k)logk) = O(nlogk),当k较小,接近 线性效率,且堆的空间很小(只有k),适合于海量数据查询 第k小元素。此方法得益于在堆中,插入、查找等各项操作 小元素。 时间复杂度均为logk。 (4)快速选择算法 最坏情况:O(n),但此处n有个系数,渐进意义上忽略。
例如,若ε=9/10,算法递归调用所产生的子 数组的长度至少缩短1/10。所以,在最坏情况 下,算法所需的计算时间T(n)满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。
2.9 线性时间的选择问题
如果能在线性时间内找到一个划分wk.baidu.com准,使得按这个 基准所划分出的2个子数组的长度都至少为原数组长度 的ε倍(0<ε<1是某个正常数),那么就可以在最坏情 况下用O(n)时间完成选择任务。
2.9 线性时间的选择问题
思考2: 能否有O(N)时间的算法,在给定n个不同数字的集合S以及一 个正整数K(K<=n),请确定出S中Top K个数(即最大的K个 数,并未要求按顺序),或Last K个数(即最小的K个数)。 输出最大的K个数(最小的K个数也同理)算法如下: (1)先采用O(n)的快速选择算法找到第K大的数ak; (2)再对S一遍扫描,输出大于等于ak的所有数;或者更简 单的方法,此时ak为基准元素,右边元素都比ak大,输出ak 及其之后所有的元素。
O(1) nC T ( n) T ( n) O(n) n C , 0 1 T ( n) O ( n)
不是期望O(n),而 是最坏情况O(n)
2.9 线性时间的选择问题
迭代
/n n log1 log

T (n) T (n) O(n) T ( 2 n) O(n) O(n) T (1) O(
2.9 线性时间的选择问题
因此可以证明:当按照“中位数的中位数“规则来选取支点的 基准元素时,有下面的结论: 若r=5,那么n≥75,有max{|left|,|right|}≤3n/4,即 min{|left|,|right|}≥n/4 若r=7,那么n足够大时,有max{|left|,|right|}≤5n/7, 即min{|left|,|right|}≥2n/7 若r=9,那么n足够大时,有max{|left|,|right|}≤7n/8, 即min{|left|,|right|}≥n/8
2.9 线性时间的选择问题
思考3: 能否有O(N)时间的算法,在给定n个不同数字的集合S以及一 个正整数K(K<=n),请确定出S中最接近其中位数的K个数。 输出最接近中位数的K个数算法如下: (1)先采用O(n)的快速选择算法找到中位数am; (2)计算S中每个元素与中位数的偏差,即集合T, T = { |a-am| | a∈S} (3)O(n)找出T的第K小元素y; (4)扫描原数组集合S,计算集合M, M = { a | if a∈S, and |a-am|≤y }
在最坏情况下,算法randomizedSelect需要O(n2)计算时间。 但只要适当选择基准值,可以证明算法randomizedSelect可以 在O(n)平均时间内找出n个输入元素中的第k小元素。
2.9 线性时间的选择问题
如果能在线性时间内找到一个划分基准,使得按这个 基准所划分出的2个子数组的长度都至少为原数组长度 的ε倍(0<ε<1是某个正常数),那么就可以在最坏情 况下用O(n)时间完成选择任务。
2.9 线性时间的选择问题
4,一般性选择问题 (3)快速选择算法
template<class Type> Type RandomizedSelect(Type a[],int p,int r,int k) { if (p==r) return a[p]; int i=RandomizedPartition(a,p,r), 算法期望O(n),但 j=i-p+1; 最坏情况O(n2) if (k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); }
median-of-median-of-five partitioning
Type Select(Type a[], int p, int r, int k) { if (r-p<75) { 用某个简单排序算法对数组a[p:r]排序; return a[p+k-1]; }; for ( int i = 0; i<=(r-p-4)/5; i++ ) 将a[p+5*i]至a[p+5*i+4]的第3小元素 与a[p+i]交换位置; //找中位数的中位数,r-p-4即上面所说的n-5 Type x = Select(a, p, p+(r-p-4)/5, (r-p-4)/10); int i=Partition(a,p,r, x), j=i-p+1; if (k<=j) return Select(a,p,i,k); else return Select(a,i+1,r,k-j); }
2.9 线性时间的选择问题
复杂度分析
C1 n 75 T ( n) C 2 n T (n / 5) T (3n / 4) n 75
T(n)=O(n)
上述算法将每一组的大小定为5,并选取75作为是否作递归 调用的分界点。这两点保证了T(n)的递归式中2个自变量之 和n/5+3n/4=19n/20=εn,0<ε<1。这是使T(n)=O(n)的关 键之处。当然,除了5和75之外,还有其他选择。
2.9 线性时间的选择问题
给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n 个元素中第k小的元素 当k=1,找最小元素 当k=n,找最大元素 当k处于中间的元素,称为中位数 当n为奇数时,中位数只有1个,k=(n+1)/2; 当n为偶数时,中位数有2个,k=n/2, n/2+1,可视为两个 中位数(上、下中位数),也可视为这两个中间数的平均值. 1,找最大元素FindMax 算法最坏情况下 的时间复杂性为 O(n)
先展示“中位数的中位数”作为划分的例子 再解释为什么要选择这个数作为基准划分
例:r=5,n=27,数组: a=[2,6,8,1,4,10,20,6,22,11,9,8,4,3,7,8,16,11,10,8,2,14,15,1,12,5,4] 这27个元素被分为6组:[2,6,8,1,4],[10,20,6,22,11],[9,8,4,3,7], [8,16,11,10,8],[2,14,15,1,12],[5,4]。 每组的中位数分别为:4,11,7,10,12,4。 中位数的中位数为7([4,11,7,10,12,4]),7就被作为基准元素(也就是支 点元素)来划分原数组。 由此可得划分为:left=[2,6,1,4,6,4,3,2,1,5,4],共11个元素。 Middle=[7]。 Right=[8,10,20,22,11,9,8,8,16,11,10,8,14,15,12],共15个元素。 现在要寻找第k小的元素: 若k<12,仅在left当中寻找; 若k=12,则要找的元素就是基准元素7。 若k>12,则需要检查right中的15个元素,并且是在right中寻找第(k-12) 小的元素。
2.9 线性时间的选择问题
思考1:中间的中间做基准元素解决“选择问题”,n个元素划 分n/r个组,每组r个元素,若当: (1)r=5 (4)r=3 (2)r=7 (3)r=9 (5)r为大于等于5的奇数
该算法Select效率如何?还是线性的吗? 当r=5,或7,或9时:T (n) T ( n / 5) T (3n / 4) O(n) T (n) O (n)
n 1) ( log
n) ... O(n) O(n)
O(n) O(n) O( 2 n) ... O(1) 1 O( n) 1 O ( n)
:共
n log

2.9 线性时间的选择问题
中位数的中位数方法思路——寻找支点元素的方法 首先将数组a中的n个元素分为n/r组,每组r个元素 (可能最后一组外少于r), 然后通过在每组中对r个元素排序来寻找每组中的中 位数。 最后根据得到的n/r个中位数,再寻找一个中位数的 中位数,以这个元素作为划分基准。
2.9 线性时间的选择问题
小课堂:【思考】关于中位数 1) 中位数和平均数概念一样吗? 解答:不一样! 一组数任何一个变化,都会影响平均数的值。 而处在一个有序序列最中间位置的一个数(或最 中间的两个数)叫做这组数据的中位数。中位数的 大小仅与数据的排列位置有关。因此中位数不受偏 大和偏小数的影响,当一组数据中的个别数据与别 数差距较大时,常用中位数来描述集中趋势。 正态分布,平均数等于中位数。
2.9 线性时间的选择问题
相关文档
最新文档