算法与数据结构 查找

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n
j 1
11外结点
n
2
2
例:ASLS=(1*1+2*2+3*4+4*4)/11=3 不成功查找时的查找长度:h-1或h次
BUPT SCST
BUPT
1. 具有12个关键字的有序表,在等概率情况下,折半查找的 平均查找长度( A) A. 3.1 B. 4 C. 2.5 D. 5 2. 折半查找的时间复杂度为( D) A. O(n2) B. O(n) C. O(nlogn) D. O(logn) 3. 用二分(对半)查找表的元素的速度比用顺序法( D) A. 必然快 B. 必然慢 C. 相等 D. 不能确定 4.在顺序表(8,11,15,19,25,26,30,33,42,48,50)中,用二分 (折半)法查找关键码值20,需做的关键字比较次数为 4 ____.
[定义]
二叉排序树或者是空树,或者是满足如下性质的二 叉树: 1)若其左子树非空,则左子树上所有结点的值均小于根 结点的值; 2)若其右子树非空,则右子树上所有结点的值均大于等 45 于根结点的值; 3)其左右子树本身又各是一棵二叉排序树 24 53 [性质] 中序遍历一棵二叉排序树,将得到 一个以关键字递增排列的有序序列 12 28 90
BUPT
第八章
查找
8.1 基本概念与术语
BUPT
查找表 同一类型的记录(数据元素)的集合。 查找 指定某个值,在查找表中确定是否存在一个记录,该 记录的关键字等于给定值。 关键字 记录(数据元素)中的某个数据项的值。 主关键字 该关键字可以唯一地标识一个记录。 次关键字 该关键字不能唯一标识一个记录。 静态查找表 对查找表的查找仅是以查询为目的,不改动查 找表中的数据。 动态查找表 在查找的过程中同时插入不存在的记录,或删 除某个已存在的记录。 查找成功 查找表中存在满足查找条件的记录。 查找不成功 查找表中不存在满足查找条件的记录。
BUPT SCST
8.3 二分查找
BUPT
满足 r[i].key r[i+1].key, 0 i <n-1 仍可用顺序查找,但在找不到时不需比较到表尾,只需比较到比给定值大的记 录就可终止。
[折半(二分)查找法] 1 2 3 4
5
6
7
8
9 10 11
05 13 19 21 37 56 64 75 80 88 92 low mid high =(low+high)/2 K=21 l h m K=85 l h m 1 11 6 1 11 6 1 5 3 7 11 9 4 5 4 10 11 10 10 9
j i 1 j l
找出最小pi的对应的i; 若相邻关键字的权值大,则确定为权值大的关 键字对应的i
BUPT SCST
BUPT
简化计算pi的方法: i 设定累计权值和 swi = wj
j 0

w sw
j j l
i 1
i 1
swl 1
pi = |(swh-swi)-(swi-1-swl-1)| =|(swh + swl-1)- swi - swi-1| 设 sw-1=0 2)ri的左子树: ( rl, rl+1, ..., ri-1)构造的次优查找树 3)ri的右子树: ( ri+1, ..., rh-1, rh )构造的次优查找树
BUPT SCST
BUPT
[程序设计技巧] 设置监视哨,提高算法效率。 [性能分析] 空间:一个辅助空间。 时间: 1) 查找成功时的平均查找长度 设表中各记录查找概率相等 ASLs(n)=(1+2+ ... +n)/n =(n+1)/2 2)查找不成功时的平均查找长度 ASLf =n+1 [算法特点] 算法简单,对表结构无任何要求 n很大=>查找效率较低 改进措施:非等概率查找时,可将查找概率高的记录尽量 排在表前部。
red 0.20 5 0.55 0.10 ↑i
white yellow 0.25 0.20 6 7 0.80 1.00 0.35 0.80 0.20 ↑i 0.25
BUPT SCST
8.5 分块查找
BUPT
[索引表的构造] 索引表 index[0..b-1] 最大关键字值 22 42 86 起始地址 0 4 8 主表 r [0..n-1](分块有序/有序) key 12 22 13 8 28 33 38 42 86 76 50 63 其它项 0 1 2 3 4 5 6 7 8 9 10 11 [分块查找步骤] 1)折半或者顺序查找索引表,确定所在块 2)在已确定的块中顺序查找/折半查找
BUPT SCST
BUPT
设b为索引表长度,s为块中记录个数 顺序查找索引表+顺序查找被确定的块 1 b 1 s 1 n ASLbs= j i 1 ( b s ) 1 2 2 ( s) 1
b
j 1
s i 1
s
当s取 n 时,ASLbs取最小值 n 1 折半查找索引表+顺序查找被确定的块 ASLbs=[log2(b+1)-1]+(s+1)/2 log2(n/s+1)+s/2 实用中,各块大小不一定相等 分块查找效率介于顺序查找和折半查找之间
BUPT SCST
BUPT
[次优查找树的构造方法] PH值近似为最小 比静态最优查找树易于构造,时间开销少
已知按关键字有(升)序的记录序列: ( rl, rl+1, ..., ri-1, ri, ri+1, ..., rh-1, rh ) 1)选取记录ri作为根结点: h i 1 计算所有pi (lih) pi wj wj
BUPT SCST
8.2 顺序表的查找
BUPT
r[0..n]
0 1 a0 a1
n-1 n an-1
r[n].key=K
[算法描述] int seqsearch (int *a, const int n, const int K ) { int i = 0; a[n] = K; while (a[i] != K) i++; return i; }
在有序表A[1..12]中,采用二分查找算法查等于A[12] 的元素,所比较的元素下标依次为__________ 6,9,11,12 。
BUPT SCST
8.4 静态树表的查找
BUPT
[问题出发点] 讨论有序表中各记录查找概率不等时,查找成功时 的ASLs。 1 2 3 4 5 关键字 15 19 36 42 67 查找概率 0.1 0.2 0.1 0.4 0.2 折半查找 高概率为根 42 4 36 3 +折半 19 2 67 5
j i 1
w
h
j
swh swi
BUPT SCST
BUPT
设有一组数据black,blue,green,purple,red,white,yellow,它们的查找概率分别为 0.10,0.08,0.12,0.05,0.20,0.25,0.20。 试以它们的查找概率为权值,构造一棵 次优查找树,并计算其查找成功的平均查找长度。
BUPT SCST
BUPT
方法2:照定义,二叉排序树的左右子树都是二叉排序树, 根结点的值大于左子树中所有值而小于右子树中所有值, 即根结点大于左子树的最大值而小于右子树的最小值。
bool JudgeBST(BTree t) int max(BTree p)//求左子树的最大值 { {if (p==NULL) return -maxint; if(t==NULL) return TRUE; //返回机器最小整数 if (JudgeBST(t->lc) && JudgeBST(t->rc)) else{ { while(p->rc!=null) p=p->rc; m=max(t->llink); return p->data;} } n=min(t->rlink);//左子树中最大值和 右子树中最小值 return (t->data>m && t->data<n); int min(BTree p)//求右子最小值 } {if (p==NULL) return maxint; else{ else return FALSE;//不是 } while(p->lc!=NULL) p=p->lc; return p->data;} }
BUPT SCST
BUPT
[性能分析] 3 <
判定树(描述查找过程的二叉树)
6 =
>
9
1 2
1
-1 2 3-4
4
5 6-7
7
8 9-10
10内结点
11 h
1-2 2-3 4-5 5-6 7-8 8-9 10-11 h=log2n+1 {同完全二叉树,二叉树性质4} 成功查找时的平均查找长度(等概率): h 1 ASLs= j 2 j 1 n 1 log (n 1) 1 log (n 1) 1
BUPT SCST
BUPT
内查找 整个查找过程都在内存中进行。 外查找 在查找过程中需要访问外存。 平均查找长度ASL——查找方法时效的度量 为确定记录在查找表中的位置,需将关键字和给定值 比较次数的期望值。 n pi ci 查找成功时的ASL计算方法:ASL

i 1
n:记录的个数 pi:查找第i个记录的概率, ( 不特别声明时认为等概率 pi =1/n ) ci:找到第i个记录所需的比较次数 约定:无特殊说明,一般默认关键字的类型为整型
15 1 42 4
19 2 67 5 15 1 36 3
ASLs=2.3
ASLs=1.8
BUPT SCST
BUPT
[静态最优查找树] 定义:查找性能最佳的判定树。 性质:带权内路径长度之和 PH为最小值。 n PH= 与ASLs成正比 w ihi

i 1
Hale Waihona Puke Baidu
其中n:二叉树上结点的个数(有序表长度) hi:第i个结点在二叉树上的层次数 wi=cpi:c为某个常量; pi:第i个结点的查找概率 最优查找体现的原则: 1)最先访问的结点应是访问概率最大的结点; 2)每次访问应使结点两边尚未访问的结点的被访概率 之和尽可能相等。
BUPT SCST
BUPT
[算法描述]
int binsearch ( int K, int v[ ], int n ) { int low, high, mid; low = 1; high = n; while ( low <= high ) { mid = ( low + high ) / 2; if ( K < v[mid] ) high = mid - 1; else if ( K > v[mid] ) low = mid + 1; else /* 找到了匹配的值*/ return mid; } return -1; /* 没有查到*/ }
判别给定二叉树是否为二叉排序树的算法如何实现?? (用二叉链表存储)
BUPT SCST
BUPT
方法1:根据二叉排序树中序遍历所得结点值为增序的性质, 在遍历中将当前遍历结点与其前驱结点值比较,即可得出 结论。
void JudgeBST(BTree t,int flag) { //全局指针pre,初值为NULL;调用时变量flag=TRUE if (t!=NULL && flag) { JudgeBST(t->lc,flag);// 中序遍历左子树 if(pre==NULL) pre=t;// 中序的第一个结点不判断 else if(pre->data<t->data) pre=t;//前驱指针指向当前结点 else flag=FLASE; //不是完全二叉树 JudgeBST(t->rc,flag);// 中序遍历右子树 } }
关键字 black blue green purple 权值 0.10 0.08 0.12 0.05 j 1 2 3 4 SWj 0.1 0.18 0.30 0.35 △Pj 0.9 0.72 0.52 0.35 (根) △Pj 0.25 0.07 0.13 0.30 ↑i △Pj 0.05 0.12 ↑i
BUPT SCST
BUPT
1.有一个2000项的表,欲采用等分区间顺序查找方法进行查 找,则每块的理想长度是__(1)___,分成__(2)___块最为 理想,平均查找长度是__(3)___。 (1)45 (2)45 (3)46
BUPT SCST
8.6 二叉排序树BST(二叉查找/搜索树)
BUPT
相关文档
最新文档