算法设计与分析-第5章-减治法

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

5.2.3 选择问题
寻找 第k小元素问题 二、问题分析 考虑快速排序中的划分过程,一般情况下,设待划分的序列 为ri ~ rj,选定一个轴值将序列ri ~ rj进行划分,使得比轴值小的 元素都位于轴值的左侧,比轴值大的元素都位于轴值的右侧,假 定轴值的最终位置是s,则: (1)若k=s,则rs就是第k小元素; (2)若k<s,则第k小元素一定在序列ri ~ rs-1中; (3)若k>s,则第k小元素一定在序列rs+1 ~ rj中; 无论哪种情况,或者已经得出结果(如果轴值恰好是序列的中 值),或者将选择问题的查找区间减少一半。
j=2
j<k,在右边区间找第k(=8-2=6)小元素
5.2.3 选择问题
选择问题的例子
{37,14,35,49,13,52,12,57,29,32,54,51,16,22,23,17,61,36,33,25} {22,14,35,25,13,33,12,36,29,32,17,23,16,37,51,54,61,57,52,49}
n足够小
O (nlogn)
应用减治法(例如减半法)得到的算法通常具有如下递推式:
0 T (n) T (n / 2) 1
n 1 n 1
O (logFra Baidu bibliotekn)
5.1 减治法概述
三、减治法的时间复杂性 减治法只对一个子问题求解,并且不需要进行解的合并。 应用减治法(例如减半法)得到的算法通常具有如下递推式:
[ ri … rk … rs-1 ] rs [ rs+1 … … rj ] 均 ≤ rs 轴值 均 ≥ rs [ ri … … rs-1 ] rs [ rs+1 …rk … rj ] 均 ≤ rs 轴值 均 ≥ rs
(a) 若k<s,则rk在左半区
(b) 若k>s,则rk在右半区
5.2.3 选择问题
5.2.1 折半查找
二、问题分析:
基本思想:在有序表中,取中间记录作为比较对象,若给 定值与中间记录的关键码相等,则查找成功;若给定值小 于中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右半区 继续查找。不断重复上述过程,直到查找成功,或所查找 的区域无记录,查找失败。
二叉查找树 = 平衡二叉树?
5.2.2 二叉查找树
二、问题分析
由二叉查找树的定义,在二叉查找树root中查找给定值k 的过程是: ⑴ 若root是空树,则查找失败; ⑵ 若k=根结点的值,则查找成功; ⑶ 否则,若k<根结点的值,则在root的左子树上查找; ⑷ 否则,在root的右子树上查找; 上述过程一直持续到k被找到或者待查找的子树为空, 如果待查找的子树为空,则查找失败。
5.2.2 二叉查找树
四、算法分析 在二叉排序树上查找关键码等于给定值的结点的过程, 恰好走了一条从根结点到该结点的路径,和给定值的比较 次数等于给定值的结点在二叉排序树中的层数,比较次数 最少为1次(即整个二叉排序树的根结点就是待查结点), 最多不超过树的深度。 具有n个结点的二叉树的深度至少是 log2 n 1 ,至 多是n,所以,二叉排序树的查找性能在O(log2n)和O(n) 之间。
5.2.1 折半查找
四、算法分析 判定树——描述折半查找的判定过程。
长度为n的判定树的构造方法为:
(1)当n=0时,判定树为空; (2)当n>0时,判定树的根结点是有序表中序号为 mid=(n+1)/2的记录,根结点的左子树是与有序表r[1] ~ r[mid-1]相对应的判定树,根结点的右子树是与r[mid+1] ~
5.2.2 二叉查找树
63 55 42 10 45 58 70 90 10 83 55
42
45 58 63
70 83 90
67
67
(a) 按63,90,55,58,70,42,10,45,83,67 的顺序构造的二叉排序树
(b) 按55,42,10,70,63,58,83,67,90,45 的顺序构造的二叉排序树
5.1 减治法概述
原问题 的规模是n
子问题 的规模是n/2
子问题的解
原问题的解
5.1 减治法概述
例:计算an的值,应用减治技术得到如下计算方法:
a n2 2 n a (a ) ( n - 1) 2 2 ´ ) a ( a
n 1 n 1 且是偶数 n 1 且是奇数
O (log2n)
{8,33,17,51,57,49,35,11,25,37,14,3,2,13,52,12,6,29,32,54,5,16,22,23,7,61,36,9}
{3,7,5,6,2,8,11,25,37,14,35,49,13,52,12,57,29,32,54,51,16,22,23,17,61,36,33,9}
二叉查找树的查找效率就在于只需要查找两个子树之一
在二叉查找树中查找关键字值为35,95的过程:
50 30 50
5.2.2 二叉查找树 实例
80
40 90 85 88 32 20
30
80
20
35 32
40
35 85
90
88
简述查找过程?
5.2.2 二叉查找树
三、算法设计
二叉排序树的结点结构为: struct BiNode
选择问题的例子
选择问题的查找过程示例(查找第4小元素)
查找过程:以5为轴值划分
序 列 4<5 , 只 在 左 侧 查 找
5 2 2
3 3 3
8 4 4
1 1
4 6 5 6
9 9
2 7 8 7
,以 2 为轴值划分序列 4>2
,只在右侧查找,以4为轴 值划分序列 4 = 4 ,轴值即 为第4小元素
1 · · ·· ·
k [ r1 … … … rmid-1 ] rmid [ rmid+1 … … … rn ] (mid=(1+n)/2)
如果k<rmid查找这里
如果k>rmid查找这里
5.2.1 折半查找
例:查找值为14的记录的过程: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
7 14 18 21 23 29 31 35 38 42 46 49 52
low=1
18>14
mid=3
mid=7 31>14 high=6
high=13
high=2
mid=1
7<14
low=2
mid=2
14=14
5.2.1 折半查找
三、算法设计
算法5.1——折半查找
1. low=1;high=n; //设置初始查找区间 2. 测试查找区间[low,high]是否存在,若不存在,则查找失败; 否则 3. 取中间点mid=(low+high)/2; 比较k与r[mid],有以下三种情况: 3.1 若k<r[mid],则high=mid-1;查找在左半区进行,转2; 3.2 若k>r[mid],则low=mid+1;查找在右半区进行,转2; 3.3 若k=r[mid],则查找成功,返回记录在表中位置mid;
34
31 3
31 3
81
T(n)=1 n=1 T(n)=2T(n/2)+1 n>1
T(n)=O(n)-蛮力法 不是所有的分治法都比简 单的蛮力法有效
5.1 减治法概述
二、分治法和减治法区别
应用分治法(例如二分法)得到的算法通常具有如下递推式:
g (n) T (n) 2T (n / 2) c
第5章 减治法
5.1 5.2 5.3 5.4 5.5 减治法概述 查找问题中的减治法 排序问题中的减治法 组合问题中的减治法 减治法小结
5.1 减治法概述
分治法是把一个大问题划分为若干个子问题, 分别求解各个子问题,然后再把子问题的解进行 合并得到原问题的解。 减治法同样是把一个大问题划分为若干个子 问题,但是这些子问题不需要分别求解,只需求 解其中的一个子问题,因而也无需对子问题的解 进行合并。 所以,严格地说,减治法应该是一种退化了 的分治法。
0 T (n) T (n / 2) 1
n 1 n 1
所以,通常来说,应用减治法处理问题的效率是很高的, 一般是O(log2n)数量级。
5.2 查找问题中的减治法
5.2.1 折半查找 5.2.2 二叉查找树 5.2.3 选择问题
5.2.1
一、问题描述:
折半查找
应用折半查找方法在一个有序序列中查找值为k的记 录。若查找成功,返回记录k在序列中的位置,若查找失 败,返回失败信息。
5.2.3 选择问题
一、问题描述: 设无序序列 T =(r1, r2, …, rn),T 的第k(1≤k≤n)小元素 定义为T按升序排列后在第k个位置上的元素。给定一个序 列T和一个整数k,寻找 T 的第k小元素的问题称为选择问题。 特别地,将寻找第n/2小元素的问题称为中值问题。 在n个元素的无序数组中选择第k(1<=k<=n)小元素。 当k=1时,相当于找最小值。 当k=n时,相当于找最大值。 当k=n/2时,称中值。
1
2 4 3 · · ·· ·
3 4 · · · · · · · · · ·
· · 4 · · 3
5.2.3 选择问题
选择问题的例子 A[1…28]={8,33,17,51,57,49,35,11,25,37,14,3,2,1 3,52,12,6,29,32,54,5,16,22,23,7,61,36,9},求A的 中位数元素,即第14小元素。(k=14)
5.2.1 折半查找
5.2.2 二叉查找树
一、问题描述
二叉查找树(Binary Search Tree),也称二叉搜索树、有 序二叉树(ordered binary tree),二叉排序树(sorted binary tree) 二叉查找树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等 于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于或等 于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的节点(no duplicate nodes)。 在一个无序序列中执行查找操作,可以将无序序列建立一 棵二叉查找树,然后在二叉查找树中查找值为k的记录,若查找 成功,返回记录k的存储地址,若查找失败,返回空指针。
j=6
j<k,在右边区间找第k(=14-6=8)小元素
{11,25,37,14,35,49,13,52,12,57,29,32,54,51,16,22,23,17,61,36,33,9} {9,11,37,14,35,49,13,52,12,57,29,32,54,51,16,22,23,17,61,36,33,25}
r[n]相对应的判定树。
5.2.1 折半查找
具有11个结点的判定树
6
3 1
2 4 5 7
9 10
log2 n 1
8
11
在表中查找任一记录的过程,即是判定树中从根结点到 该记录结点的路径,和给定值的比较次数等于该记录结点在 树中的层数。具有n个结点的判定数的深度为 log2 n 1 。
应用分治法得到an的计算方法是:
a n 2 n 2 a a
n
a
n 1 n 1
O (n)
应用分治法计算an 。
5.1 减治法概述
如果 n 1
n 2
a
n
分析时 间性能
n a
32 31 3 9
a
2

a
如果 n 1
32 分解问题 31 求解每个子问题 3 9 合并子问题的解
5.1 减治法概述
一、设计思想 规模为n的原问题的解与较小规模(通常是n/2)的子 问题的解之间具有关系: (1)原问题的解只存在于其中一个较小规模的子问题中; (2)原问题的解与其中一个较小规模的解之间存在某种 对应关系。 由于原问题的解与较小规模的子问题的解之间存在这 种关系,所以,只需求解其中一个较小规模的子问题就可 以得到原问题的解。
{ int data; //结点的值,假设查找集合的元素为整型
BiNode *lchild, *rchild; //指向左、右子树的指针 };
算法5.2——二叉排序树的查找
BiNode * SearchBST(BiNode *root, int k) { if (root= =NULL) return NULL; else if (root->data==k) return root; else if (k<root->data) return SearchBST(root->lchild, k); else return SearchBST(root->rchild, k); }
相关文档
最新文档