数据结构查找

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

MAX(二分查找法)=t=log2 (n+1)= log2 n 由于在第i次平分比较中可以找到2i-1个结点, 即在n个结点中有2i-1个结点是经过i次比 较被找到,因此 AVG(二分查找法) 1 = (1 + 2 21 + 3 2 2 + L + t 2t 1 ) n
1 t = ∑ i 2i 1 n i =1
只考虑n=2t-1(t>=0)的情况,现在计算一下需 要执行平分比较的次数. 平分时的一次比较可产生三种结果. 如果t=1,只执行一次平分比较; 否则,m=2t-1-1. 若km=v,则过程结束; 否则继续对2t-1-1个结点k0,k1,…,km-1或 km+1,km+2,…,kn-1执行平分比较. 因此,最多平分t次必可完成,由此可得
假设具有n个整数结点的线性表按顺序存 贮方式存放在整数数组a[MAXN]前n个数 组元素中,n<MAXN. #define MAXN 100 int a[MAXN]; int n;
下面的C函数seque1()和seque2()都实现在 a[0],a[1]…a[n-1]中查找值为v的结点. 若查找成功,则返回存放值为v的结点的 数组元素的下标; 若查找失败,则返回-1;
= ∑i 2
i =1 t 1
t 1
i 1
+t 2
t 1
= 2 (t 2) + 1 + t 2
t t t
t 1
t 1
= 2 (t 1) + 1 = 右边
t
= t 2 2 + 1 + t 2 = 2t 2 2 + 1 = t 2 2 + 1
t 1
∑i 2
i =1
t
i 1
= 2 (t 1) + 1
Chapter 6 Searching
线性表的查找
查找:对给定 的线性表和某一键值v,从
线性表中找一个键值为v的结点.
顺序查找 二分查找 Hash查找 查找
6.2 Sequential Searching (顺序查找法) 顺序查找法)
顺序查找法是最基本,最简单,也是最 常用的查找方法. 此方法把线性表中的结点k0, k1,…kn-1的键 值v作比较.如果找到所需结点,那么查 找成功;如果整个表都查遍了,仍未找 到所需的结点,那么查找失败. 顺序查找法不仅适用于顺序存贮的线性 表,也适用于链接存贮的线性表.
设Si是查找结点ki的比较次数.根据上述 定义,显然有: MAX(顺序查找法)=n AVG(顺序查找法)= ∑ si pi = ∑ (i + 1) pi =
i =0
i =0
n 1
n 1
∑ ip
i =1
n
i 1
搜索成功
ACN =

n 1 i=0
p i× c i
若搜索概率相等, 若搜索概率相等,则
i 2i 1 = 2t (t 1) + 1 用归纳法容易证明: ∑
t
证明 当t=1时,
左边 = ∑ i 2
i =1 t i 1
i =1
= t 2
t 1
|
t =1
= 1 = 2 (1 1) + 1 = 右边
1
设t-1时,等式成立.考察t时,
左边 = ∑ i 2
i =1 t 1 t t i 1
二分查找图示之二
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=23, i=0,j=3,i<j
i + j 0+3 m= = =1 2 2
第二次比较 v=23=a[1],
查找成功
二分查找图示之三
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=96, i=0,j=9,i<j
i + j 0+9 m= = = 4 2 2
第一次比较 v=96>54,
i=m+1=5, j=9
二分查找图示之四
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=58, i=5,j=6,i<j
i + j 5+6 m= = = 5 2 2
第三次比较 v=58<a[5]=60,
继续查找
二分查找图示之十
0 1 2 3 4 5 6 7 8 9
继续查找
二分查找图示之八
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=58, i=5,j=9,i<j
i + j 5+9 m= = = 7 2 2
第二次比较 v=58<a[7],
继续查找
二分查找图示之九
二分查找图示之一
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=23 i=0,j=9,i<j
i + j 0+9 m= = = 4 2 2
第一次比较 v=23<54,
i=0, j=m-1=4-1=3
t
将t=log2(n+1)代入上式,可得:
1 t 1 i 1 ∑ i 2 = n {(n + 1)[log 2 (n + 1) 1] + 1} n i =1
n +1 = [log 2 (n + 1)] 1 n
AVG(二分查找法) =[(n+1)/n][㏒ (n+1)]-1≈ ㏒ n
2 2
p250 /*RecBinary1:recursive forgetful version of binary search. Pre:The contiguous list has been created,and bottom and top are indices of entries in the list . Post: If an entry in list between bottom and top,inclusive has key equal to target,then the function returns the location of the first such entry(success).Otherwise,the function returns –1(failure)*/
1 n 1 1 ACN = ∑ ( i + 1) = (1 + 2 + L + n ) = n i =0 n 1 (1 + n ) n 1 + n = = n 2 2
搜索不成功 数据比较 n 次
假设用链表head表示链接存贮的线性表, 要求在链表中查找键值为v的结点.若查 找成功,则返回存放键值为v的结点的地 址;否则,返回NULL. #include<stdio.h> struct node { int data; struct node *link; }; typedef struct node NODE; NODE *head;
i + j 8+9 m= = = 8 2 2
第三次比较 v=96>a[8]=82,
继续查找
二分查找图示之六
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 mid i j
搜索 v=96, i=m+1=9,j=9,i=j
i + j 9+9 m= = = 9 2 2
int seque1(a,n,v) int a[],v; int n; { int i; for(i=0; i<n&&a[i]!=v; i++); if(i<n) return(i); return(-1); }
在函数seque2()中,首先置a[n]=v,使得查找 总是成功,但若a[ i]=v,且i=n时,则表明表中 没有值为v的结点. int seque2(a,n,v) int a[],v,n; { int i; a[n]=v; //设置岗哨 for(i=0; a[i]!=v;i++); if(i<n) return(i); return(-1); }
搜索 v=96, i=5,j=9,i<j
i + j 5+9 m= = = 7 2 2
第二次比较 v=96>a[m]=a[7]=75,
继续查找
二分查找图示之五
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 mid i j
搜索 v=96, i=m+1=8,j=9,i<j
int SequeutialSearch (List list, keyType target) { //p235 int location; for (location=0; location<list.count; location++) if (EQ(list.entry[location].key, target))
data 12 23 26 37 54 60 68 75 82 96 j i mid
搜索 v=58, i=5,j=m-1=4,i>j 不满足 i≤i, ≤
跳出循环,返回 跳出循环,返回-1
int a[MAXN]; int n;
int bisect(a,n,v) int a[],v, n; { int i,j,m; i=0; j=n-1; while(i<=j){ m=(i+j)/2; if(v==a[m])return(m); if(v<a[m]) j=m-1; else i=m+1; } return(-1); }
存放在数组元素a[0],a[1]…a[n-1]中.
二分查找法的算法:
1.置i =0, j=n-1; 2.若i>j,则查找失败,算法结束; 否则,转5. 3.置m=(i+j)/2;
4.若v=a[m],则查找成功,算法结束; 否则,转5. 5.若v<a[m],则置j=m-1,转2; 否则,置i=m+1.转2.
第四次比较 v=96=a[9],
查找成功
二分查找图示之七
0 1 2 3 4 5 6 7 8 9
data 12 23 26 37 54 60 68 75 82 96 i mid j
搜索 v=58, i=0,j=9,i<j
i + j 0+9 m= = = 4 2 2
第一次比较 v=58>a[4],
NODE *seque3(head,v) NODE *head; int v; { for(; head!=NULL&&head->data!=v; head=head->link); return(head); }
6.4 Binary search p248
二分查找法
Definition An ordered list is a list in which each entry contains a key, such that the keys are in order. That is, if entry i comes before entry j in the list, then the key of entry i is less than or equal to the key of entry j. 假设具有n个整数结点的线性表按键值的递增次序 排好序,且按顺序存贮方式把线性表中的结点依次
/*list->entry[loc]=list.entyr[loc]*/
return location; return -this function keeps moving through the list as long as the target key target has not been found but terminates as soon as the target is found. If the search is successful, the function returns location of the target. If the search is unsuccessful, then the function returns –1.
相关文档
最新文档