第9章查找表(2)-2,3节-c

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

是具有如下特性的二叉树:
(1)若它的左子树不空,则左子树上 所有结点的值均小于根结点的值;
(2)若它的右子树不空,则右子树上 所有结点的值均大于根结点的值;
(3)它的左、右子树也都分别是二叉
排序树。
例如:
30
20 10 23 25 35
50
80
40 66 85 88 90
二叉排序树的中序遍历序列: 是二叉排序树。 20,30,32,35,40,50,80,85,88,90
第九章 查找表
9.1 基本概念
9.2 静态查找表
9.3 动态查找树表 9.4 哈希表
9.2 静 态 查 找 表
一、静态查找表数据类型定义 二、静态查找表存储结构 三、顺序查找表 四、有序查找表 五、静态查找树表
六、索引顺序表
四、有序查找表
上述顺序查找表中的查找算法简单,
但平均查找长度较大,特别不适用于
所得次优二叉树如下所示:
E
C A B
查找比较“总次数” = 32+41+25+33 +14+33+25 = 52
和折半查找相比较
G D F
A
B
D F
C
E
G
查找比较“总次数” = 32+21+35+13 +34+23+35 = 59
1.定义:
二叉排序树或者是一棵空树;或者
可以根据斐波那契序列的特点对有序查找表进行分割。 分割区间的原则: 若表长为 n =F (k)-1, 则选择其中间点为F (k-1)-1。 前一个子表的长度为F (k-1)-1, 后一个子表的长度为F (k-2)-1。
n =F (k)-1= F (k-1)+F (k-2)-1 ={ F (k-1)-1} + 1 + {F (k-2)-1}
最大次数=
log 2 n +1
7 8
9
10
2
11
一般情况下,表长为 n 的折半查找判 定树的深度和含有 n 个结点的完全二叉 树的深度相同。
假定有序表的长度为 n=2h-1,则h=log2(n+1);
设查找概率相等Pi=1/n n h 1 1 n 1 j 1 则:ASL Ci j 2 log2 (n 1) 1 bs n i 1 n j 1 n 在n>50时,可得近似结果
定义:使PH值达到最小的判定树称为最优二叉树。
n PH w i hi i 1
一种次优二叉树的构造方法:
已知一个按关键字有序的序列:
每个记录对应的权值为:
( rl, rl+1 , … , rh )
( wl, wl+1 , … , wh )
构造次优二叉树的方法是: 1. 在记录序列中,取第 i 个记录构造根结点,使: 取最小值。
表长较大的查找表。 若以有序表表示静态查找表,则查
找过程可以基于“折半”进行。
例如: key = 64 的查找过程如下
ST.length ST.elem
05 13 19 21 37 56 64 75 80 88 92
0 1 2
low
3 4
5 6
7 8
9 10 11
high
low high mid mid mid
构造次优二叉树的递归算法
Status SecondOptimal(BiTree &T, ElemType R[], float sw[], int low, int high) {
// 由有序表R[low..high]及其累计权值表sw, 递归构造次优查找树T。
② ③ 选择最小的ΔPi值 ④ if (!(T = new BiTNode)) return ERROR; T->data = R[i]; // 生成结点 if (i==low) T->lchild = NULL; // 左子树空 else SecondOptimal(T->lchild, R, sw, low, i-1); ⑤ // 构造左子树 if (i==high) T->rchild = NULL; // 右子树空 else SecondOptimal(T->rchild, R, sw, i+1, high); ⑤ // 构造右子树 return OK; } // SecondOptimal 时间复杂度:O(n logn)
low 指示查找区间的下界; high 指示查找区间的上界; mid = (low+high)/2。
例如: key = 70 的查找过程如下
ST.length ST.elem
05 13 19 21 37 56 64 75 80 88 92
0 1 2
low
3 4
5 6
7 8
9 10 11
high
high low high mid mid low mid mid
1. 平均性能比折半查找好; 2. 最坏情况比折半差; 3. n很大时,黄金分割法; 4. 分割只需要做加减法;
9.2 静 态 查 找 表
一、静态查找表数据类型定义 二、静态查找表存储结构 三、顺序查找表 四、有序查找表 五、静态查找树表
六、索引顺序表
五、静态查找树表
在不等概率查找的情况下,折半查找不是 有序表最好的查找方法 例如: 关键字: A B C D E Pi: 0.2 0.2 0.2 0.2 0.2 Pi: 0.2 0.3 0.05 0.3 0.15 Ci: 2 3 1 2 3 此时 ASL等概率= (2+3+1+2+3)0.2=2.2 此时 ASL不等概率=20.2+30.3+10.05+20.3+30.15=2.4 若改变Ci的值 2 1 3 2 3 则 ASL不等概率=20.2+10.3+30.05+20.3+30.15=1.9
} // Search_Bin
分析折半查找的平均查找长度 先看一个具体的情况,假设查找表:n=11 查找表:{ A B C D E F G H I J
K }
i 1 2 3 4 5 6 7 8 9 10 11 Ci 3 4 2 3 4 1 3 4 2 3 4
判定树
ASL = 33/11
3
1
6 4 5
n
0 1
2 3 4 5 6
7
8
9
10
11
12
F(n) 0 1 1 2 3 5 8 13 21 34 55 89 144
分割区间的原则: 若表长为 n =F (k)-1, 则选择其中间点为F (k-1)-1。 前一个子表的长度为F (k-1)-1, 后一个子表的长度为F (k-2)-1。
举例:表长 n=12,12=F(7)-1 , k=7
P i
j i 1 h i 1
w
j
w
j l l
j
2. 然后继续对子序列{ rl, rl+1,…,ri-1 } 和 { ri+1,…, rh } 构造两棵次优二叉树,并分别为根结点的左子树 和右子树。
F
D B A C E 4
H
I
构造次优二叉树的方法是: 1. 在记录序列中,取第 i 个记录构造根结点,使: 取最小值。
0 1 2 3 4 5 6 7 8 9 10 11
-1
low
0
1
3
4
6
8
10
12
17
20
23
mid=F(5)-1 high=F(6)-2 =4 =6
mid=F(6)-1 =7
low=F(6)=8
high=F(7)-2 =11 mid=F(6)+F(4)-1 =10
前子表长: F (7-1)-1=F(6)-1=7 后子表长: F (7-2)-1=F(5)-1=4
ASL bs log2 (n 1) 1
分析折半查找的平均查找长度 先看一个具体的情况,假设查找表:n=11 查找表{ A B C D E F G H I
J
K }
i 1 2 3 4 5 6 7 8 9 10 11 Ci 3 4 2 3 4 1 3 4 2 3 4
判定树
查找不成功次数?
3
1
P i
j i 1
w
h
j
w
j l l
i 1
j
i
为便于计算,引入累计权值和 swi w j
j 1
w1, w2 , …, wl-1, wl, …,wi-1, wi, wi+1 , … , wh
① sw , sw , …, sw , sw , …,sw , sw , sw , … , sw 1 2 l-1 l i-1 i i+1 h ③ 选择最小△Pi
4 5 6 7 3 4 3 5
key
9 6 1 2 A B C C D E E F G A G
11 15 18 23 4 3 10 18 5 3 0 8
P i ( swh swl 1 ) swi swi 1
所得次优二叉树如下所示:
E
C A B
查找比较“总次数” = 32+41+25+33 +14+33+25 = 52
swi

构造根结点
swi
则推导可得 Pi (swh swl 1 ) swi swi1
⑤ 继续构造左子 树和右子树 ②
w
j l
j i+1 i 1
w
h
j
= swh - swi
j
= swi-1- swl-1
例如:
l
h
h
l
h
i 0 1 2 3 j wij 0 2 1 5 swij 0 2 3 8 Δpij 21 18 12
--1
1-2
6 4
3-4 2-3 4-5
最大次数=
log 2 n +1
内部结点 外部结点
7 8
7-8
9
10
9-10 8-9
2
5
6-6
6-7
11
10-11 11--
斐波那契查找
F (n) =
n
0 1
n,
7 8
n=0, 1
9 10 11 12
F(n-1)+F(n-2), n≥2
2 3 4 5 6
F(n) 0 1 1 2 3 5 8 13 21 34 55 89 144
low 指示查找区间的下界; high 指示查找区间的上界; mid = (low+high)/2。
int Search_Bin ( SSTable ST, KeyType kval ) { low = 1; high = ST.length; // 置区间初值 while (low <= high) { mid = (low + high) / 2; if (kval == ST.elem[mid].key ) return mid; // 找到待查元素 else if ( kval < ST.elem[mid].key) ) high = mid - 1; // 继续在前半区间进行查找 else low = mid + 1; // 继续在后半区间进行查找 } return 0; // 顺序表中不存在待查元素
第九章 查找表
9.1 基本概念
9.2 静态查找表
9.3 动态查找树表 9.4 哈希表
9.3 动 态 查 找 树 表
一、二叉排序树(二叉查找树) 二、二叉平衡树 三、B - 树 四、B+树 五、键 树
一、二叉排序树
(二叉查找树) 1.定义 2.查找算法 3.插入算法 4.删除算法
5.查找性能的分析
和折半查找相比较
G D F
A
B
D F
C
E
G
查找比较“总次数” = 32+21+35+13 +34+23+35 = 59
构造次优二叉树的算法 Status CreateSOSTre(SOSTree &T, SSTable ST) { // 由有序表 ST 构造一棵次优查找树 T。 // ST 的数据元素含有权域 weight if (ST.length = 0) T = NULL; else { ① FindSW(sw, ST); // 按照有序表 ST 中各数据元素 // 的 weight 值求累计权值表 SecondOpiamal(T, ST.elem, sw, 1, ST.length); } return OK; } // CreatSOSTree

2.二叉排序树的查找算法
若二叉排序树为空,则查找不成功; 否则 1)若给定值等于根结点的关键字, 则查找成功;
P i
j i 1
wk.baidu.com
w
h
j
w
j l l
i 1
j
2. 然后继续对子序列 { rl, E rl+1,…,r 关键字: A B C D F i-1 G} 和 H{ ri+1 I ,…, rh }
构造两棵次优二叉树,并分别为根结点的左子树 权值: 1 1 2 5 3 4 4 3 5 和右子树。
0.05 0.2
C B
折半查找判断树
0.3
A
0.3
D
0.3
0.15
E
A
0.2 0.05
B
C
非折半查找判断树
D
0.3
E
0.15
问题:判定树为何种二叉树时,平均查找性能最佳?
n ASL pi Ci i 1
如果只考虑查找成功的情况,则使平均查找性能 达到最佳的判断树是其带权内路径长度之和取最小 值的二叉树。即:PH取值最小。
相关文档
最新文档